在C++ 11中读/写/打印UTF-8

Eph*_*era 9 wchar-t utf-8 codecvt utf-32 c++11

我一直在探索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';
Run Code Online (Sandbox Code Playgroud)

我的问题非常简单,为什么循环中wchar_t需要for?一个u8文本字符串可以使用一个简单的声明char *和UTF-8编码的位布局应告诉系统字符的宽度.似乎有一些从UTF-8到UTF-32的自动转换(因此wchar_t),但如果是这种情况,为什么转换是必要的?

eca*_*mur 5

您使用wchar_t是因为您正在使用读取文件wifstream; 如果你使用读ifstream你使用char了,同样char16_tchar32_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元素.