Страницы

Поиск по вопросам

суббота, 15 июня 2019 г.

Не удается вывести текст из файла в кодировке UTF8, содержащий кириллицу на консоль

Не получается прочитать текст, включающий в себя кириллицу и вывести на консоль из файла, который имеет кодировку UTF8. Имеется следующий код:
#include #include #include #include #include
int main(int argc, wchar_t* argv[]) { std::wcout.imbue(std::locale("rus_rus.866")); std::wcin.imbue(std::locale("rus_rus.866"));
std::wfstream fout;
fout.open(L"cd.txt", std::ios::in);
if (fout.is_open()) { fout.imbue(std::locale("rus_rus.1251"));
wchar_t ch; std::wstring inputT; while (fout.get(ch)) inputT += ch; std::wcout << inputT; std::wcout << std::endl;
fout.close(); } std::cin.get(); return 0; }
Причем если читаемый файл имеет кодировку ANSI, весь текст включая русские буквы отображается корректно, но если файл в кодировке UTF8, то отображается что то вообще не то. Как это можно исправить?


Ответ

Проблема делится на две части: как вывести текст и как прочитать его.
Для вывода имеет смысл воспользоваться рекомендацией отсюда (_setmode(_fileno(...), _O_U16TEXT); и использование std::wstring).
Это означает, что нам нужно прочитать из файла строки из utf-8 в формат wstring. Это делается так
fout.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8));
(и должно работать вне зависимости от ширины wchar_t). Вы используете std::locale("rus_rus.1251"), это не должно работать.

Комментариев нет:

Отправить комментарий