我一直在探索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';
我的问题很简单,为什么在
for
循环中需要wchar_t
?可以使用简单的char *
声明u8
字符串字面值,并且UTF-8编码的位布局应该告诉系统字符的宽度。似乎存在从UTF-8自动转换为UTF-32(因此需要wchar_t
),但如果是这种情况,为什么需要转换?
wchar_t
是因为使用了wifstream
,而wifstream
执行了你提到的“某些自动转换”。我的观点是要展示这种自动转换(在一个特定平台上实现)与codecvt_utf8_utf16
提供的显式、可移植、与语言环境无关的Unicode转换之间的区别。 - Cubbi