1

重现: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

视窗命令codecvt.exe

输出:Test String O├û U├£ S┼Ş i─░ ─▒I

MSYS2 重击$ ./codecvt.exe

输出:(Test String O├û U├£ S┼Ş i─░ ─▒I相同)

适用于 Windows 10 Bash 的 Ubuntu 子系统

使用 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 没有按要求输出,但输入正确。

适用于 Windows 10 Bash 的 Ubuntu 子系统在输入和输出方面都是正确的。

第二种解决方案

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相关的问题?

4

0 回答 0