UTF-8でエンコードされた文字列をUTF-16でエンコードされたCStringW
に変換する際に問題があります。大きなUTF-8エンコードされたchar *文字列をCStringW(UTF-16)に変換するには?
CStringW ConvertUTF8ToUTF16(__in const CHAR * pszTextUTF8)
{
_wsetlocale(LC_ALL, L"Korean");
if ((pszTextUTF8 == NULL) || (*pszTextUTF8 == '\0'))
{
return L"";
}
const size_t cchUTF8Max = INT_MAX - 1;
size_t cchUTF8;
HRESULT hr = ::StringCbLengthA(pszTextUTF8, cchUTF8Max, &cchUTF8);
if (FAILED(hr))
{
AtlThrow(hr);
}
++cchUTF8;
int cbUTF8 = static_cast<int>(cchUTF8);
int cchUTF16 = ::MultiByteToWideChar(
CP_UTF8,
MB_ERR_INVALID_CHARS,
pszTextUTF8,
-1,
NULL,
0
);
CString strUTF16;
strUTF16.GetBufferSetLength(cbUTF8);
WCHAR * pszUTF16 = new WCHAR[cchUTF16];
int result = ::MultiByteToWideChar(
CP_UTF8,
0,
pszTextUTF8,
cbUTF8,
pszUTF16,
cchUTF16
);
ATLASSERT(result != 0);
if (result == 0)
{
AtlThrowLastWin32();
}
strUTF16.Format(_T("%s"), pszUTF16);
return strUTF16;
}
pszTextUTF8
はUTF-8でのHTMファイルの内容です:
は、ここに私のソースコードです。 htmファイルのボリュームが500kb未満の場合、このコードはうまく機能します。 しかし、500kbのhtmファイルを変換すると(私が持っている648KBのhtmファイル) pszUTF16
にはすべてのファイルの内容が含まれていますが、strUTF16
はありません。 (約半分) ファイルオープンが間違っていないと思います。
strUTF16 m_pszData
にはどのように取得するのですか? strUTF16.Getbuffer();
'CStringW strUTF16 = CA2W(pszTextUTF8、CP_UTF8)は'あなたのすべてです必要。まだ動作していない場合は、ファイルを読み込んでいる部分を表示してください。 UTF8ファイルを読むときは、ヌルターミネータのためのスペースを残して、最後のバイトを0にしてください。 –
ありがとうございました。私は私の問題を解決しました。 MSビジュアルスタジオのテキストビジュアライザ効率の問題でした。私は変換したファイルCStringコンテンツとしてエクスポートしました。ファイルより完全な内容です!もう一度感謝します〜 – Kim
@BarmakShemirani:それはそれに多くの思考を入れないで動作する直進的な解決策です。ただし、余分なコピーが生成され、最後の文字列の2倍のメモリが必要です。問題のコードは 'CStringW'オブジェクトを作成したいので、そのバッファに直接書き込んで、余分なバッファとコピー操作の両方を安全に行うことができます。 – IInspectable