2010-02-02 25 views
2

我根據這兩個轉換函數和StackOverflow上的答案,但轉換回的往復不起作用:UTF-8 /從UTF-16問題

std::wstring MultiByteToWideString(const char* szSrc) 
{ 
unsigned int iSizeOfStr = MultiByteToWideChar(CP_ACP, 0, szSrc, -1, NULL, 0); 
wchar_t* wszTgt = new wchar_t[iSizeOfStr]; 
if(!wszTgt) assert(0); 
    MultiByteToWideChar(CP_ACP, 0, szSrc, -1, wszTgt, iSizeOfStr); 
std::wstring wstr(wszTgt); 
delete(wszTgt); 
return(wstr); 
} 

std::string WideStringToMultiByte(const wchar_t* wszSrc) 
{ 
    int iSizeOfStr = WideCharToMultiByte(CP_ACP, 0, wszSrc, -1, NULL, 0, NULL, NULL); 
    char* szTgt = new char[iSizeOfStr]; 
    if(!szTgt) return(NULL); 
    WideCharToMultiByte(CP_ACP, 0, wszSrc, -1, szTgt, iSizeOfStr, NULL, NULL); 
    std::string str(szTgt); 
    delete(szTgt); 
    return(str); 
} 

[...] 

// はてなブ in utf-16 
wchar_t wTestUTF16[] = L"\u306f\u3066\u306a\u30d6\u306f\u306f"; 

// shows the text correctly 
::MessageBoxW(NULL, wTestUTF16, L"Message", MB_OK); 

// convert to UTF8, and back to UTF-16 
std::string strUTF8 = WideStringToMultiByte(wTestUTF16); 
std::wstring wstrUTF16 = MultiByteToWideString(strUTF8.c_str()); 

// this doesn't show the proper text. Should be same as first message box 
::MessageBoxW(NULL, wstrUTF16.c_str(), L"Message", MB_OK); 

回答

4

檢查文檔爲WideCharToMultiByte()。 CP_ACP使用當前系統代碼頁進行轉換。這是非常有損耗的。你想要CP_UTF8。

+1

工作正常,如果我將所有四個CP_ACP更改爲CP_UTF8 ...謝謝! – Warpin 2010-02-02 01:00:44

+1

只有在char *數據始終爲UTF-8時纔有效。如果您需要將數據轉換爲/來自其他Ansi語言,則必須每次使用正確的代碼頁。 – 2010-02-04 03:05:03