http://hi.baidu.com/magicfuzzx/item/e5fd6a954c0a3aae82d29531
//將unicode字串轉換為多位元組字串
int WideCharToMultiByte(
UINT CodePage, //字碼頁,一般為CP_ACP
DWORD dwFlags, //額外標記,一般為0
LPCWSTR lpWideCharStr, //unicode字串
int cchWideChar, //unicode字串的大小,(-1)為函數自己判斷
LPSTR lpMultiByteStr, //ANSI字串的緩衝區,必須指定大小
int cbMultiByte, //ANSI字串緩衝區的大小(注意為0的意思)
LPCSTR lpDefaultChar, //一般為NULL,不能轉化的時候使用參數改指定的字元
LPBOOL lpUsedDefaultChar //轉換成功為FALSE,失敗為TRUE
);
cbMultiByteStr:如果該參數為0的話,那麼函數的作用就是返回需要的緩衝區的大小,而前面的lpMutliByteStr參數就可以為NULL(因為已經失去了意義)。
CodePage:要與新轉換的字串關聯的字碼頁。
dwFlags:允許我們指定額外的轉換控制,這些標誌會影響帶變音符號的字元和系統不能轉化的字元,但我們一般不需要進行這種程度的轉換控制,而直接賦值為0
lpWideCharStr:指向將被轉換的unicode字串。
cchWideChar:指定由參數lpWideCharStr指向的緩衝區的字元個數。如果這個值為-1,字串將被設定為以NULL為結束符的字串,並且自動計算長度。
lpMultiByteStr:指向接收被轉換字串的緩衝區。
cchMultiByte:指定由參數lpMultiByteStr指向的緩衝區最大值(用位元組來計量)。若此值為零,函數返回lpMultiByteStr指向的目標緩衝區所必需的位元組數,在這種情況下,lpMultiByteStr參數通常為NULL。
lpDefaultChar和pfUsedDefaultChar:只有當WideCharToMultiByte函數遇到一個寬位元組字元,而該字元在uCodePage參數標識的字碼頁中並沒有它的標記法時,WideCharToMultiByte函數才使用這兩個參數。如果寬位元組字元不能被轉換,該函數便使用lpDefaultChar參數指向的字元。如果該參數是NULL(這是大多數情況下的參數值),那麼該函數使用系統的預設字元。該預設字元通常是個問號。這對於檔案名稱來說是危險的,因為問號是個萬用字元。pfUsedDefaultChar參數指向一個布爾變數,如果Unicode字串中至少有一個字元不能轉換成等價多位元組字元,那麼函數就將該變數置為TRUE。如果所有字元均被成功地轉換,那麼該函數就將該變數置為FALSE。當函數返回以便檢查寬位元組字串是否被成功地轉換後,可以測試該變數。這兩個參數基本上被設定為NULL。
傳回值:如果函數運行成功,並且cchMultiByte不為零,傳回值是由lpMultiByteStr指向的緩衝區中寫入的位元組數;如果函數運行成功,並且cchMultiByte為零,傳回值是接收到待轉換字串的緩衝區所必需的位元組數。如果函數運行失敗,傳回值為零。若想獲得更多錯誤資訊,請調用GetLastError函數。它可以返回下面所列錯誤碼:
ERROR_INSUFFICIENT_BJFFER;ERROR_INVALID_FLAGS;
ERROR_INVALID_PARAMETER;ERROR_NO_UNICODE_TRANSLATION。
//將多位元組字串轉換為uniode字串
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cbMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
參數跟WideCharToMultiByte一致就是少了最後兩個參數。
使用例子:
LPWSTRlpHello = L"Hello World";
/*擷取所需要的緩衝區的大小*/
UINT nBufferSize;
nBufferSize = WideCharToMultiByte(CP_ACP,0,lpHello,-1,NULL,0,NULL,NULL);
/*申請需要的緩衝區*/
LPSTRlpTarget;
lpTarget = (LPSTR)HeapAlloc(GetProcessHeap(),0,sizeof(char) * nBufferSize);
/*正式轉換*/
WideCharToMultiByte(CP_ACP,0,lpHello,-1,lpTarget,nBufferSize,NULL,NULL);
//do something-_-
/*釋放所緩衝區*/
HeapFree(GetProcessHeap(),0,lpTarget);
//比這樣寫要好看多了
LPWSTRlpHello = L"Hello World";
CHARszBuf[MAX_PATH];
memset(szBuf,0,sizeof(szBuf));
WideCharToMultiByte(CP_ACP,0,lpHello,(int)wcslen(lpHello),szBuf,sizeof(szBuf),NULL,NULL);
cout<<szBuf<<endl;