我正在使用VC 6.0。我的项目是用Unicode编译的。我正在使用zlib 1.1.3来扩展包含我的UTF-8字符串的文件。我在ASCII中得到它,但我保证它全部用英语,所以我可以将它作为UTF8字符串(可以吗?)。
我在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.检测到严重错误c0000374 2. w3wp.exe(NTDLL.DLL)中的第一次机会异常:0xC0000005:访问冲突。
我怀疑存在内存泄漏或错误指针被引用,因为在使用此函数时我得到了很多上述错误。我的测试还表明,当我不使用它时,堆保持良好的形状而不会被破坏。
您能否建议更好地实施此问题?
答案 0 :(得分:6)
MultiByteToWideChar
返回输出中的16位Unicode字符数 - 不字节数。但是malloc
需要字节数。您必须将字符数乘以字符的字节大小,否则您只分配一半所需的字节数!
ptr = (WCHAR *)malloc(sizeof(WCHAR) * *pLen);