@rust21

Как прочитать на С++ Unicode файл с русским текстом?

Всем привет) Возникла задача читать Unicode файлы с содержимым на русском языке. Для решения задачи создал тестовый файл в Блокноте, заполнил его русским текстом и сохранил как Unicode. После пытался его прочитать следующими способами:
1)
std::wstring readUtf16(const std::string &filename) {

    std::ifstream file(filename.c_str());
    std::stringstream ss;
    ss << file.rdbuf() << '\0';
    return std::wstring((wchar_t*)ss.str().c_str());
}


Где-то в программе:
std::wstring ws = readUtf16("test.txt");

    std::string s(ws.begin(),ws.end());
    std::cout << s.size() << " "<< s;


Данный способ выводит правильную длину строки s, но в консоль выводит кракозябры (вставить в начале setlocale пробовал)

2) Пытался использовать подход с использованием wstring и wchar_t при помощь wifstream. Эффекта ноль вообще (в консоль не выводится ничего).

3) Пытался использовать кодеры из codecvt следующим образом:
const std::locale utf16_locale_in = std::locale(std::locale::empty(),
                                                new std::codecvt_utf8_utf16<wchar_t>());
    {
        std::wifstream input("test.txt");
        std::wstring ws;
        input.imbue(utf16_locale_in);
        std::getline(input,ws);
        std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t> converter;
        std::string s = converter.to_bytes(ws);
        std::cout << s << " " << s.size();
    }

Эффекта опять же ноль. Проблем с чтением английского текста не возникало. Прошу помощи у знающих людей.
  • Вопрос задан
  • 2573 просмотра
Пригласить эксперта
Ответы на вопрос 1
@xibir
у меня вот так работает:
std::ifstream f("/temp/u.txt", std::ifstream::binary);
f.seekg(0, f.end);
int size = f.tellg();
f.seekg(0, f.beg);
std::u16string us1;
us1.resize(size / 2);
f.read((char*)&us1[0], 2 * us1.length());
// us1 теперь содержит utf16 строку
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы