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),但如果是这种情况,为什么转换是必要的?
您使用wchar_t是因为您正在使用读取文件wifstream; 如果你使用读ifstream你使用char了,同样char16_t和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元素.
| 归档时间: |
|
| 查看次数: |
8607 次 |
| 最近记录: |