9

私はC++11の新しいUnicode機能を調査してきましたが、他のC ++ 11エンコーディングの質問は非常に役立ちましたが、 cppreferenceの次のコードスニペットについて質問があります 。コードは、UTF-8エンコーディングで保存されたテキストファイルを書き込み、すぐに読み取ります。

// Write
std::ofstream("text.txt") << u8"z\u6c34\U0001d10b";

// Read
std::wifstream file1("text.txt");
file1.imbue(std::locale("en_US.UTF8"));
std::cout << "Normal read from file (using default UTF-8/UTF-32 codecvt)\n";
for(wchar_t c; file1 >> c; ) // ?
   std::cout << std::hex << std::showbase << c << '\n';

私の質問は非常に単純ですが、なぜループにwchar_t必要なのですか?for文字u8列リテラルは単純なものを使用して宣言できchar *、UTF-8エンコーディングのビットレイアウトはシステムに文字の幅を通知する必要があります。UTF-8からUTF-32への自動変換があるようです(したがってwchar_t)が、その場合、なぜ変換が必要なのですか?

4

2 に答える 2

5

;wchar_tを使用してファイルを読み取っているために使用します。wifstreamを使用して読んでいた場合は、をifstream使用charし、同様にchar16_tとを使用しますchar32_t

(例のように)それwchar_tが32ビットであり、それが表すネイティブ文字セットがUTF-32(UCS-4)であると仮定すると、これはファイルをUTF-32として読み取る最も簡単な方法です。UTF-16としてファイルを読み取るのとは対照的に、例ではそのように示されています。より移植性の高い方法は、UTF-8入力ストリームからUTF-32要素への変換が保証されているためbasic_ifstream<char32_t>、明示的に使用することです。std::codecvt_utf8<char32_t>

于 2013-03-18T10:53:22.983 に答える
2

使用したcppreferenceコードスニペットのアイデアは、UTF-8ファイルをUTF-16文字列に読み取る方法を示すことです。そのため、ファイルはofstreamを使用して書き込みますが、wifstream(したがってwchar_t)を使用して読み取ります。

于 2013-03-18T09:23:39.690 に答える