1

私はVC 6.0で作業しています。私のプロジェクトは Unicode でコンパイルされています。UTF-8 文字列を含むファイルを膨張させるために zlib 1.1.3 を使用しています。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: アクセス違反。

この関数を使用しているときに上記のエラーが多く発生するため、メモリ リークまたは参照されているポインタが間違っていると思われます。私のテストでは、ヒープを使用しない場合でも、ヒープが適切に形成され、破損していないことが示されています。

この問題に対するより良い実装を提案していただけますか?

4

1 に答える 1

6

MultiByteToWideCharバイト数ではなく、出力内の 16 ビット Unicode 文字の数を返します。ただしmalloc、バイト数が必要です。文字数に文字のバイトサイズを掛ける必要があります。そうしないと、必要なバイト数の半分しか割り当てられません!

ptr = (WCHAR *)malloc(sizeof(WCHAR) * *pLen);
于 2013-02-20T07:06:30.493 に答える