Воспроизвести: codecvt.cpp
#include <iostream>
#include <locale>
#include <string>
#include <codecvt>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
locale utf8(locale(), new codecvt_utf8<wchar_t>);
wcout.imbue(utf8);
wstring str(L"Test String OÖ UÜ SŞ iİ ıI");
wcout << str << '\n';
}
Компилировать с GCC 6.3.0: g++ codecvt.cpp -o codecvt -O3
Windows CMD: codecvt.exe
Выход: Test String O├û U├£ S┼Ş i─░ ─▒I
MSYS2 Bash: $ ./codecvt.exe
Выход: Test String O├û U├£ S┼Ş i─░ ─▒I
(так же)
Подсистема Ubuntu для Windows 10 Bash:
Компилировать с GCC 5.4.0: g++ codecvt.cpp -o codecvt -O3
Выполнение: ./codecvt
Выход: Test String OÖ UÜ SŞ iİ ıI
В последнее время я боролся с проблемами с широким характером в c ++. Я столкнулся с этим решением, но кажется, что код работает только в среде Linux. (Я начинающий с ++ (ish))
Я также попробовал некоторые другие решения:
Первое решение:
setlocale(LC_ALL, "");
Windows CMD выводит по желанию, без проблем. Но ввод ошибочен.
MSYS2 Bash не выводит должным образом, но ввод правильный.
Подсистема Ubuntu для Windows 10 Bash корректна как с вводом, так и с выводом.
Второе решение:
locale::global(locale("C.UTF-8"));
Windows CMD и MSYS2 Bash аварийно завершают работу при запуске программы, MSYS2 Bash также сообщает:
what(): locale::facet::_S_create_c_locale name not valid
Подсистема Ubuntu Bash по-прежнему классная, работает на ввод / вывод корректно.
Я предполагаю, что это проблема, связанная с Windows?
Задача ещё не решена.
Других решений пока нет …