Это нормально читать, это просто не писать.
std::wcout << (wchar_t)fin.get() << "\n";
К сожалению std::wcout
фактически не надежно получить Unicode к терминалу.
Хотя терминал Windows работает из кодированных блоков UTF-16, std::wcout
по-прежнему определяется исключительно на основе байтов. Он преобразует свой широкий вход вниз в байты, используя стандартную кодировку по умолчанию для локали, прежде чем записывать в старый добрый поток untele unteode byte stdout (который, в конце концов, может быть перенаправлением файла изначально байтов, а также вывода изначально-Unicode) ,
Таким образом, std::wcout
заканчивается как ограниченный под Windows, так и все остальные байтовые интерфейсы ввода-вывода, ограниченные символами на текущей кодовой странице. Ваша кодовая страница, вероятно, 932, где символ 单
U + 5355 не существует, поэтому попытка написать его разбивает поток.
Установка текущей кодовой страницы на 65001 в попытке получить тот же выход UTF-8, который предпочитают все другие современные платформы, не совсем работает из-за множества многобайтовых ошибок подсчета символов в базовой среде C. MS оставили это сломанным для многих нескольких версий, поэтому ожидайте, что UTF-8 останется гражданином второго сорта под Windows.
Некоторые альтернативы:
Использование в Win32 API WriteConsoleW
вместо STDLIB интерфейсов. (Требуется осторожность, чтобы справиться с возможным перенаправление вывода, и если вам нужен проект для кросс-платформенной совместимости.)
_setmode
Использование с _O_U16TEXT
, чтобы изменить выходной поток в UTF-16 закодированных байт. См. Пример в this question. Кажется, не все интерфейсы обязательно работают в этом режиме; у вас наверняка возникнут проблемы, если вы попытаетесь одновременно использовать байтовые интерфейсы.
Вывести явно UTF-8-кодированные байты и потребовать, чтобы пользователи консоли Windows просто мирились с моджибаке и отсутствующими глифами.
Жаль, что эта история по-прежнему так несчастна.
http://www.cplusplus.com/reference/ios/ios/good/ почему бы вам не понять, почему именно ваш поток не уедешь. – thang
Вы уверены, что файл UTF8 закодирован? –
Можете ли вы сделать шестнадцатеричный дамп файла? –