【发布时间】:2013-03-06 13:36:08
【问题描述】:
我一直在探索 C++11 的新 Unicode 功能,虽然 other C++11 encoding questions 非常有帮助,但我对来自 cppreference 的以下代码 sn-p 有疑问。代码写入然后立即读取以 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),但如果是这种情况,为什么需要进行转换?
【问题讨论】:
-
这取决于很多事情。值得注意的是,即使不是不可能在控制台应用程序中使用 Windows,正确的 UTF8 行为也非常困难(需要至少大量非标准 API 调用 IIRC)
-
wchar_t被使用,因为wifstream被使用,wifstream执行你提到的“一些自动转换”。我的意思是展示自动转换(针对一个特定平台实现)与codecvt_utf8_utf16提供的显式、可移植、独立于语言环境的Unicode 转换之间的区别。
标签: utf-8 c++11 wchar-t utf-32 codecvt