Всем привет) Возникла задача читать 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();
}
Эффекта опять же ноль. Проблем с чтением английского текста не возникало. Прошу помощи у знающих людей.