1

Нашёл, как мне показалось, очень полезную статью: ссылка

Попробовал использовать "Правильное, но сложное решение", ничего к сожалению не вышло. Полностью перешёл с string на wstring, с консольных и файлов потоков на соответствующие расширенные потоки wcout, wcin, wifstream, так же с обычных С-строка на расширенные C-строки. Точнее из консоли получается взять Русские слова, а из файлов нет. Пример:

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int wmain(int argc, wchar_t **argv)
{
    wifstream in{ "input.txt" };
    wstring line;
    getline(in, line);
    wcout << line << endl;
    return 0;
}

В итоге всё равно кракозябре в консоли и при отладке в "line", аналогичные кракозябры.

1 Answers1

1

Пример по ссылке рассказывает о кодировках при работе с консолью, файлы - совершенно отдельная песня. Считать UTF8-файл в Visual C++ проще всего, я думаю, с помощью функции fopen (используя параметр ccs для указания кодировки).

#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <iostream>
#include <string>    

using namespace std;

int wmain(int argc, wchar_t **argv)
{
    _setmode(_fileno(stdout), _O_U16TEXT);     

    wchar_t buf[500]=L"";
    FILE *fp = fopen("input.txt", "rt+, ccs=UTF-8");
    fgetws(buf,500,fp);
    fclose(fp);

    wstring line(buf);
    wcout << line << endl;
    getchar();
    return 0;
}