Чтение/запись / печать 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).