Вот небольшой код, который читает строку из файла UFT-8:
#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <locale>
#include <fstream>
#include <codecvt>
int main()
{
_setmode(_fileno(stdout), _O_U8TEXT);
auto inputFileStream = std::wifstream("input.txt");
const auto utf8Locale = std::locale(std::locale(), new std::codecvt_utf8<wchar_t>());
inputFileStream.imbue(utf8Locale);
std::wstring line;
std::getline(inputFileStream, line);
std::wcout << line << std::endl;
inputFileStream.close();
return 0;
}
Когда я собираю его с помощью компилятора Visual Studio Visual C ++, я получаю следующий результат:
test τεστ тест
, как и ожидалось.
Когда я использую MinGW с компилятором GCC, я получил
琀 攀 猀 琀 쐃딃101 䈄 㔄 䄄 䈄
Как вы понимаете, это не ожидаемый результат.
- Существует ли какой-либо простой способ исправить выход для GCCк ожидаемой строке?
ИЛИ
Существует ли какой-либо
простой способ использования UTF-8 для MSVC и GCC?
Ответ (спасибо за Игорь Тандетник и Реми Лебо ): Кажется, мы должны явно указать режим с прямым порядком байтов, потому что MSVC и GCC имеют разные значения по умолчанию.Поэтому следует использовать
new std::codecvt_utf8<wchar_t, 0x10ffff, std::little_endian>()
.
Фиксированный код:
#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <locale>
#include <fstream>
#include <codecvt>
int main()
{
_setmode(_fileno(stdout), _O_U8TEXT);
auto inputFileStream = std::wifstream("input.txt");
const auto utf8Locale = std::locale(std::locale(), new std::codecvt_utf8<wchar_t, 0x10ffff, std::little_endian>());
inputFileStream.imbue(utf8Locale);
std::wstring line;
std::getline(inputFileStream, line);
std::wcout << line << std::endl;
inputFileStream.close();
return 0;
}