2010-02-02 4 views
2

I sur la base de ces deux fonctions de conversion et une réponse sur StackOverflow, mais reconvertir-et-vient ne fonctionne pas:utf-8 à/de problème 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); 

Répondre

4

Vérifiez la documentation pour WideCharToMultiByte(). CP_ACP est converti en utilisant la page de codes système en cours. C'est très difficile. Vous voulez CP_UTF8.

+1

Fonctionne très bien si je change tous les quatre CP_ACP à CP_UTF8 ... Merci! – Warpin

+1

Cela ne fonctionne que si les données char * sont toujours UTF-8. Si vous devez convertir des données vers/depuis d'autres langues Ansi, vous devez utiliser la page de codes correcte à chaque fois. –