<1>.GBK ---> UTF-8
void ConvertGBKToUtf8(CString& strGBK) { int len = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL, 0); WCHAR *wszUtf8 = new WCHAR[len+1]; memset(wszUtf8, 0, len*2+2); MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len); len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL); char *szUtf8 = new char[len+1]; memset(szUtf8, 0, len+1); WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL, NULL); strGBK = szUtf8; delete[] szUtf8; delete[] wszUtf8; }
<2>.UTF-8 ---> GBK
void ConvertUtf8ToGBK(CString& strUtf8) { int len = MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL, 0); WCHAR *wszGBK = new WCHAR[len+1]; memset(wszGBK, 0, len*2+2); MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len); len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL); char *szGBK = new char[len+1]; memset(seGBK, 0, len+1); WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL); strUtf8 = szGBK; delete[] szGBK; delete[] wszGBK; }
------------------------------------------------------------------------------------------------
ps:
[1].MultiByteToWideChar
函數功能:該函數映射一個字符串到一個寬字符(unicode)的字符串。
函數原型:
int MultiByteToWideChar( UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cchMultiByte, LPWSTR lpWideCharStr, int cchWideChar );
函數參數:
CodePage:指定執行轉換的字符集,這個參數可以為系統已安裝或有效的任何字符集所給定的值。
CP_ACP:ANSI字符集;CP_MACCP:Macintosh代碼頁;CP_OEMCP:OEM代碼頁;
CP_SYMBOL:符號字符集(42);CP_THREAD_ACP:當前線程ANSI代碼頁;
CP_UTF7:使用UTF-7轉換;CP_UTF8:使用UTF-8轉換。
dwFlags:一組未標記用以指出是否未轉換成預作或寬字符(若組合形式存在),是否使用象形文字替代控制字符,以及如何處理無效字符。
lpMultiByteStr:指向將被轉換字符串的字符。
cchMultiByte:指定由參數lpMultiByteStr指向的字符串中字節的個數。如果lpMultiByteStr指定的字符串以空字符終止,可以設置為-1(如果字符串不是以空字 符中止,設置為-1可能失敗,可能成功),此參數設置為0函數將失敗。
lpWideCharStr:指向接收被轉換字符串的緩沖區。
cchWideChar:指定由參數lpWideCharStr指向的緩沖區的字節數。若此值為零,函數返回緩沖區所必需的寬字符數,在這種情況下,lpWideCharStr中的緩沖區不被 使用。
[2].WideCharToMultiByte
函數功能:該函數映射一個unicode字符串到一個多字節字符串。
函數原型:
int WideCharToMultiByte( UINT CodePage, //指定執行轉換的代碼頁 DWORD dwFlags, LPCWSTR lpWideCharStr, //指定的寬字節字符串的緩沖區 int cchWideChar, //指定由參數lpWideCharStr指向的緩沖區的字符個數 LPSTR lpMultiByteStr, //指向接收被轉換字符串的緩沖區 int cchMultiByte, //指定由參數lpMultiByteStr指向的緩沖區最大值 LPCSTR lpDefaultChar, LPBOOL pfUsedDefaultChar );
*注意*:以上兩個函數參數指針lpMultiByteStr和lpWideCharStr必須不一樣,否則函數返回失敗