Чтение/запись / печать UTF-8 на языке C++11

Я изучал новую функциональность Юникода C++11, и в то время как другое C++11 вопросы кодирования были очень полезны, у меня вопрос о следующем фрагменте кода из cppreference. Код записывает, а затем немедленно считывает текстовый файл, сохраненный с кодировкой UTF-8.

// Write
std::ofstream("text.txt") << u8"zu6c34U0001d10b";

// 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 требуются в for петли? А u8 строковый литерал может быть объявлен с помощью простой char * и битовая компоновка кодировки UTF-8 должна сообщать системе ширину символа. Похоже, существует автоматическое преобразование из UTF-8 в UTF-32 (следовательно,wchar_t), но если это так, почему необходимо преобразование?

2 ответов


вы используете 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.


идея фрагмента кода cppreference, который вы использовали, - показать, как читать файл UTF-8 в строку UTF-16, поэтому они пишут файл с помощью ofstream, но читают его с помощью wifstream (следовательно, wchar_t).