更新: @Potatoswatter と @Jonathan Leffler のコメントに感謝します。かなり恥ずかしいことに、wstring の値が正しく表示されないデバッガー ツール ヒントに気付きましたが、それでもうまく機能せず、質問を更新しました。下:
文字列に読み込みたい小さなマルチバイトファイルがある場合、次のトリックを使用します-たとえばgetline
、区切り文字で使用します'\0'
std::string contents_utf8;
std::ifstream inf1("utf8.txt");
getline(inf1, contents_utf8, '\0');
これにより、改行を含むファイル全体が読み込まれます。
ただし、ワイド文字ファイルで同じことを実行しようとすると、機能しませんwstring
。最初の行までしか読み取れません。
std::wstring contents_wide;
std::wifstream inf2(L"ucs2-be.txt");
getline( inf2, contents_wide, wchar_t(0) ); //doesn't work
たとえば、Unicode ファイルに CRLF で区切られた文字 A と B が含まれている場合、16 進数は次のようになります。
FE FF 00 41 00 0D 00 0A 00 42
マルチバイトファイルで getline with '\0' がファイル全体を読み取るという事実に基づいて、getline( inf2, contents_wide, wchar_t(0) )
ユニコードファイル全体を読み取る必要があると信じていました。ただし、そうではありません。上記の例では、ワイド文字列に次の 2 つの wchar_ts が含まれます。FF FF
( wchar_t(0) を削除すると、期待どおりに最初の行に読み込まれます(つまりFE FF 00 41 00 0D 00
)
wchar_t(0) が wchar_t の区切りとして機能しないのはなぜ00 00
ですか?
ありがとうございました