Воспроизвести: 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. (Я новичок в c ++ (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?