2013-02-20 157 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);