在c ++中将UTF8字符串转换为UTF16字符串

时间:2013-02-20 06:58:57

标签: c++ windows visual-c++ zlib

我正在使用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:访问冲突。

我怀疑存在内存泄漏或错误指针被引用,因为在使用此函数时我得到了很多上述错误。我的测试还表明,当我不使用它时,堆保持良好的形状而不会被破坏。

您能否建议更好地实施此问题?

1 个答案:

答案 0 :(得分:6)

MultiByteToWideChar返回输出中的16位Unicode字符数 - 字节数。但是malloc需要字节数。您必须将字符数乘以字符的字节大小,否则您只分配一半所需的字节数!

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