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中需要a ?可以使用简单的方式声明字符串文字for,并且 UTF-8 编码的位布局应该告诉系统字符的宽度。似乎有一些从 UTF-8 到 UTF-32 的自动转换(因此是),但如果是这种情况,为什么需要进行转换?u8char *wchar_t

4

2 回答 2

5

您使用wchar_t是因为您正在使用wifstream;读取文件 如果您正在阅读使用,ifstream您将使用char, 并且类似地用于char16_tand char32_t

假设(如示例那样)它wchar_t是 32 位的,并且它表示的本机字符集是 UTF-32 (UCS-4),那么这是将文件读取为 UTF-32 的最简单方法;它在示例中如此呈现,以与以 UTF-16 格式读取文件形成对比。更可移植的方法是使用basic_ifstream<char32_t>std::codecvt_utf8<char32_t>显式,因为这可以保证从 UTF-8 输入流转换为 UTF-32 元素。

于 2013-03-18T10:53:22.983 回答
2

您使用的 cppreference 代码片段的想法是展示如何将 UTF-8 文件读入 UTF-16 字符串,这就是为什么他们使用 ofstream 编写文件但使用 wifstream 读取文件的原因(因此使用 wchar_t)。

于 2013-03-18T09:23:39.690 回答