使用實(shí)例如下:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif //!UNICODE
在Unicode與ANSI之間轉(zhuǎn)換字符串
Wi n d o w s 函數(shù)M u l t i B y t e To Wi d e C h a r 用于將多字節(jié)字符串轉(zhuǎn)換成寬字符串。下面顯示了M u l t i B y t e To Wi d e C h a r 函數(shù)。
int MultiByteToWideChar(
UINT CodePage, //code page
DWORD dwFlags, //character-type options
LPCSTR lpMultiByteStr, //address of string to map
int cchMultiByte, //number of bytes in string
LPWSTR lpWideCharStr, //address of wide-character buffer
int cchWideChar //size of buffer
);
u C o d e P a g e 參數(shù)用于標(biāo)識(shí)一個(gè)與多字節(jié)字符串相關(guān)的代碼頁號(hào)。d w F l a g s 參數(shù)用于設(shè)定另一個(gè)控件,它可以用重音符號(hào)之類的區(qū)分標(biāo)記來影響字符。這些標(biāo)志通常并不使用,在d w F l a g s參數(shù)中傳遞0 。p M u l t i B y t e S t r 參數(shù)用于設(shè)定要轉(zhuǎn)換的字符串,c c h M u l t i B y t e 參數(shù)用于指明該字符串的長度(按字節(jié)計(jì)算)。如果為c c h M u l t i B y t e 參數(shù)傳遞- 1 ,那么該函數(shù)用于確定源字符串的長度。
轉(zhuǎn)換后產(chǎn)生的U n i c o d e 版本字符串將被寫入內(nèi)存中的緩存,其地址由p Wi d e C h a r S t r 參數(shù)指定。必須在c c h Wi d e C h a r 參數(shù)中設(shè)定該緩存的最大值(以字符為計(jì)量單位)。如果調(diào)用M u l t i B y t e To Wi d e C h a r ,給c c h Wi d e C h a r 參數(shù)傳遞0 ,那么該參數(shù)將不執(zhí)行字符串的轉(zhuǎn)換,而是返回為使轉(zhuǎn)換取得成功所需要的緩存的值。一般來說,可以通過下列步驟將多字節(jié)字符串轉(zhuǎn)換成U n i c o d e 等價(jià)字符串:
1) 調(diào)用M u l t i B y t e To Wi d e C h a r 函數(shù),為p Wi d e C h a r S t r 參數(shù)傳遞N U L L ,為c c h Wi d e C h a r 參數(shù)傳遞0 。
2) 分配足夠的內(nèi)存塊,用于存放轉(zhuǎn)換后的U n i c o d e 字符串。該內(nèi)存塊的大小由前面對(duì)M u l t B y t e To Wi d e C h a r 的調(diào)用返回。
3) 再次調(diào)用M u l t i B y t e To Wi d e C h a r ,這次將緩存的地址作為p Wi d e C h a r S t r 參數(shù)來傳遞,并傳遞第一次調(diào)用M u l t i B y t e To Wi d e C h a r 時(shí)返回的緩存大小,作為c c h Wi d e c h a r 參數(shù)。
4. 使用轉(zhuǎn)換后的字符串。
5) 釋放U n i c o d e 字符串占用的內(nèi)存塊。
函數(shù)Wi d e C h a r To M u l t i B y t e 將寬字符串轉(zhuǎn)換成等價(jià)的多字節(jié)字符串,如下所示:
int WideCharToMultiByte(
UINT CodePage, // code page
DWORD dwFlags, // performance and mapping flags
LPCWSTR lpWideCharStr, // address of wide-character string
int cchWideChar, // number of characters in string
LPSTR lpMultiByteStr, // address of buffer for new string
int cchMultiByte, // size of buffer
LPCSTR lpDefaultChar, // address of default for unmappable
// characters
LPBOOL lpUsedDefaultChar // address of flag set when default
// char. used
);
該函數(shù)與M u l t i B i t e To Wi d e C h a r 函數(shù)相似。同樣,u C o d e P a g e 參數(shù)用于標(biāo)識(shí)與新轉(zhuǎn)換的字符串相關(guān)的代碼頁。d w F l a g s 則設(shè)定用于轉(zhuǎn)換的其他控件。這些標(biāo)志能夠作用于帶有區(qū)分符號(hào)的字符和系統(tǒng)不能轉(zhuǎn)換的字符。通常不需要為字符串的轉(zhuǎn)換而擁有這種程度的控制手段,你將為d w F l a g s 參數(shù)傳遞0 。
p Wi d e C h a r S t r 參數(shù)用于設(shè)定要轉(zhuǎn)換的字符串的內(nèi)存地址,c c h Wi d e C h a r 參數(shù)用于指明該字符串的長度(用字符數(shù)來計(jì)量)。如果你為c c h Wi d e C h a r 參數(shù)傳遞- 1 ,那么該函數(shù)用于確定源字符串的長度。
轉(zhuǎn)換產(chǎn)生的多字節(jié)版本的字符串被寫入由p M u l t i B y t e S t r 參數(shù)指明的緩存。必須在c c h M u l t i B y t e參數(shù)中設(shè)定該緩存的最大值(用字節(jié)來計(jì)量)。如果傳遞0 作為Wi d e C h a r To M u l t i B y t e 函數(shù)的c c h M u l t i B y t e 參數(shù),那么該函數(shù)將返回目標(biāo)緩存需要的大小值。通常可以使用將多字節(jié)字符串轉(zhuǎn)換成寬字節(jié)字符串時(shí)介紹的一系列類似的事件,將寬字節(jié)字符串轉(zhuǎn)換成多字節(jié)字符串。
你會(huì)發(fā)現(xiàn),Wi d e C h a r To M u l t i B y t e 函數(shù)接受的參數(shù)比M u l t i B y t e To Wi d e C h a r 函數(shù)要多2 個(gè),即p D e f a u l t C h a r 和p f U s e d D e f a u l t C h a r 。只有當(dāng)Wi d e C h a r To M u l t i B y t e 函數(shù)遇到一個(gè)寬字節(jié)字符,而該字符在u C o d e P a g e 參數(shù)標(biāo)識(shí)的代碼頁中并沒有它的表示法時(shí),Wi d e C h a r To M u l t i B y t e 函數(shù)才使用這兩個(gè)參數(shù)。如果寬字節(jié)字符不能被轉(zhuǎn)換,該函數(shù)便使用p D e f a u l t C h a r 參數(shù)指向的字符。如果該參數(shù)是N U L L (這是大多數(shù)情況下的參數(shù)值),那么該函數(shù)使用系統(tǒng)的默認(rèn)字符。該默認(rèn)字符通常是個(gè)問號(hào)。這對(duì)于文件名來說是危險(xiǎn)的,因?yàn)閱柼?hào)是個(gè)通配符。
p f U s e d D e f a u l t C h a r 參數(shù)指向一個(gè)布爾變量,如果寬字符串中至少有一個(gè)字符不能轉(zhuǎn)換成等價(jià)多字節(jié)字符,那么函數(shù)就將該變量置為T R U E 。如果所有字符均被成功地轉(zhuǎn)換,那么該函數(shù)就將該變量置為FA L S E 。當(dāng)函數(shù)返回以便檢查寬字節(jié)字符串是否被成功地轉(zhuǎn)換后,可以測(cè)試該變量。同樣,通常為該測(cè)試傳遞N U L L 。
關(guān)于如何使用這些函數(shù)的詳細(xì)說明,請(qǐng)參見Platform SDK 文檔。
如果使用這兩個(gè)函數(shù),就可以很容易創(chuàng)建這些函數(shù)的U n i c o d e 版本和A N S I 版本。例如,你可能有一個(gè)動(dòng)態(tài)鏈接庫,它包含一個(gè)函數(shù),能夠轉(zhuǎn)換字符串中的所有字符??梢韵裣旅孢@樣編寫該函數(shù)的U n i c o d e 版本:
BOOL StringReverseW(PWSTR pWideCharStr)
{
//Get a pointer to the last character in the string.
PWSTR pEndOfStr=pWideCharStr+wcslen(pWideCharStr)-1;
wchar_t cCharT;
//Repeat until we reach the center character
//in the string.
while (pWideCharStr < pEndOfStr)
{
//Save a character in a temporary variable.
cCharT=*pWideCharStr;
//Put the last character in the first character.
*pWideCharStr =*pEndOfStr;
//Put the temporary character in the last character.
*pEndOfStr=cCharT;
//Move in one character from the left.
pWideCharStr++;
//Move in one character from the right.
pEndOfStr--;
}
//The string is reversed; return success.
return(TRUE);
}
你可以編寫該函數(shù)的A N S I 版本以便該函數(shù)根本不執(zhí)行轉(zhuǎn)換字符串的實(shí)際操作。你也可以編寫該函數(shù)的A N S I 版本,以便該函數(shù)它將A N S I 字符串轉(zhuǎn)換成U n i c o d e 字符串,將U n i c o d e 字符串傳遞給S t r i n g R e v e r s e W 函數(shù),然后將轉(zhuǎn)換后的字符串重新轉(zhuǎn)換成A N S I 字符串。該函數(shù)類似下面的樣子:
BOOL StringReverseA(PSTR pMultiByteStr)
{
PWSTR pWideCharStr;
int nLenOfWideCharStr;
BOOL fOk = FALSE;
//Calculate the number of characters needed to hold
//the wide_character version of string.
nLenOfWideCharStr = MultiRyteToWideChar(CP_ACP, 0,
pMultiByteStr, -1, NULL, 0);
//Allocate memory from the process's default heap to
//accommodate the size of the wide-character string.
//Don't forget that MultiByteToWideChar returns the
//number of characters,not the number of bytes,so
//you must multiply by the size of wide character.
pWideCharStr = HeapAlloc(GetProcessHeap(), 0,
nLenOfWideCharStr * sizeof(WCHAR));
if (pWideCharStr == NULL)
return(fOk);
//Convert the multibyte string to a wide_character string.
MultiByteToWideChar(CP_ACP, 0, pMulti8yteStr, -1,
pWideCharStr, nLenOfWideCharStr);
//Call the wide-character version of this
//function to do the actual work
fOk = StnngReverseW(pWideCharStr);
if (fOk)
{
//Convert the wide-character string back
//to a multibyte string.
WideCharToMultiByte(CP_ACP, 0, pWideCharStr, -1,
pMultiByteStr, strlen(pMultiByteStr), NULL, NULL);
}
//Free the momory containing the wide-character string.
HeapFree(GetProcessHeap(), 0, pWideCharStr);
return(fOk),
}
最后,在用動(dòng)態(tài)鏈接庫分配的頭文件中,可以像下面這樣建立這兩個(gè)函數(shù)的原型:
BOOL StringReverseW (PWSTR pWideCharStr);
BOOL StringReverseA (PSTR pMultiByteStr);
#ifdef UNICODE
#define StnngReverse StringReverseW
#else
#define StringRevcrsc StringReverseA
#endif // UNICODE