2013-02-20 202 views
3

我正在使用VC 6.0。我的項目是用Unicode編譯的。我正在使用zlib 1.1.3來擴充包含我的UTF-8字符串的文件。我得到它在ASCII,但我有一個保證,它是全英文,所以我可以把它作爲一個UTF8字符串(我可以嗎?)。將一個UTF8字符串轉換爲一個UTF16字符串在c + +

我已經使用建議的功能Codeproject如下:

WCHAR* SMUUTF8toUTF16(LPCSTR utf8, int* pLen) 
{ 
    WCHAR *ptr = NULL; 
    *pLen = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0); 
    if (*pLen>1) 
    { 
     ptr = (WCHAR*)malloc(*pLen); 

     if (ptr) 
     { 
      MultiByteToWideChar(CP_UTF8, 0, utf8, -1, ptr, *pLen); 
     } 
    } 

    return ptr; 
} 

我的代碼變得不穩定,這些錯誤: 1.檢測w3wp.exe的c0000374 2.第一次機會異常嚴重錯誤(NTDLL .DLL):0xC0000005:訪問衝突。

我懷疑有一個內存泄漏或被錯誤的指針被引用,因爲當使用這個函數時,我得到了很多上面提到的錯誤。我的測試還表明,當我不使用它時,堆保持良好的形狀而不會損壞。

你能否提出一個更好的實現來解決這個問題?

回答

6

MultiByteToWideChar返回輸出中的16位Unicode字符數 - 不是的字節數。但malloc需要的字節數。您必須將字符數乘以字符的字節大小,否則您只會分配您需要的一半字節數!

ptr = (WCHAR *)malloc(sizeof(WCHAR) * *pLen);