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