在Windows中經常需要用到多字元與寬字元的轉換方法,所以多字元(MultiChar)也就是ANSI編碼的方式,而寬字元(WideChar)也就是Unicode編碼的方式。
首先是兩種傳統的轉換方法,分別是MutiByteToWideChar和WideCharToMutiByte。
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cchMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
這是多字元轉換為寬字元的方法,6個引數的含義為:CodePage(多字元所對應的的字符集,一般是CP_ACP), dwFlags(一些標準位,一般不需要使用,置0即可),lpMultiByteStr(多字元的地址),cchMultiBytes(多字元的字串長度,相當於字串的位元組數,如果是1,則由函式判斷長度), lpWideCharStr(寬字元的地址),cchWideChar(寬字元的字元長度,相當於字串的個數)。上面的兩個長度都是包含‘
’的長度。
如果lpWideCharStr不為NULL,返回轉換成功的長度;如果lpWideCharStr為NULL,返回lpMultiByteStr的字元個數(不是字串長度!!!)。
常用的用法為:
//先將lpWideCharStr置成NULL,從而得到szText的長度。 int iBuffSize = ::MultiByteToWideChar(CP_ACP, 0, szText, -1, NULL, 0); //判斷字元長度是否大於0 if (iBuffSize > 0) { LPWSTR wszString = new wchar_t[iBuffSize+1]; int nChars = ::MultiByteToWideChar(CP_ACP, 0, szText, -1, wszString, iBuffSize); //這是擔心轉換失敗,從而nChars為0,再講wszString置成空字串 nChars = nChars < iBuffSize ? nChars:iBuffSize; wszString[nChars] = 0; }
另一個是寬字元到多字元:
int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cchMultiByte,
LPCSTR lpDefaultChar,
LPBOOL pfUsedDefaultChar
);
這裡比MultiByteToWideChar多兩個引數,而前面的六個引數都是一樣的,lpDefaultChar的作用是當函式遇到一個不能轉換的寬字元時,會用lpDefaultChar來代替,如果lpDefaultChar為NULL時,則用?代替。pfUsedDefaultChar的作用是如果有一個字元沒有成功轉換,則pfUsedDefaultChar為TRUE,否則為FALSE。
int iBuffSize = ::WideCharToMultiByte(CodePage, 0, szString, -1, NULL, 0, NULL, false); if (iBuffSize > 0 ) { m_pString = new char[iBuffSize]; ::WideCharToMultiByte(CodePage, 0, szString, -1, m_pString, iBuffSize, NULL, false); }
另兩種轉換的方法是A2W和W2A,分別表示多字元到寬字元,寬字元到多字元。這兩個函式式atl的函式,所以需要加上標頭檔案<atlconv.h>
USES_CONVERSION; wchar_t wszText[]=L"1.Unicode字元轉換為ANSI;"; char szText[]="2.ANSI字元轉換成Unicode."; printf("%s ",W2A(wszText)); wprintf(L"%s ",A2W(szText));
注意的是每做一個轉換前,一定要加上USES_CONVERSION。
不過要注意是不要在大迴圈或者非常長的函式中使用W2A或者A2W,因為有記憶體溢位的問題。