std :: codecvt_utf8 фасетный ошибочный вывод с MSYS2 Bash и CMD - PullRequest
0 голосов
/ 27 апреля 2018

Воспроизвести: 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?

...