私はC++ 11の新しいUnicode機能を探求していましたが、other C++11 encoding questionsが非常に役に立ちましたが、cppreferenceから次のコードスニペットに関する質問があります。コードはUTF-8エンコーディングで保存されたテキストファイルを書き込み、すぐに読み取ります。C++でのUTF-8の読み書き/印刷11
// 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
)への自動変換があるようですが、この場合はどうして変換が必要ですか?
多くのことに依存します。特筆すべきは、正しいUTF8の動作は、コンソールアプリケーションでWindowsを使用することは不可能ではないにしても非常に困難です(非標準API呼び出しIIRCが少なくとも必要です) – sehe
'wcharstream'が使用され、' wifstream'が実行されるその "何らかの自動変換"と言います。私の指摘は、(ある特定のプラットフォームで実装された)自動変換と、 'codecvt_utf8_utf16'によって提供される明示的で移植性のある、ロケールに依存しないUnicode変換との違いを示すことでした。 – Cubbi