#include <locale>
#include <iostream>
int main()
{
std::locale::global(std::locale("en_US.utf8"));
std::wcout << L"Həł£ō שøяļđ\n";
return 0;
}
这与libstdc ++(gcc和clang)一样正常工作,但只用libc ++打印第一个字符(恰好是ASCII)。我在Gentoo Linux上使用libcxx-0.0_p20140322。
这是libc ++中的已知错误,还是我不知道如何烹饪?
更新1.我试过
std::locale::global(std::locale("en_US.utf8"));
std::locale::global(std::locale(""));
std::setlocale(LC_ALL, "en_US.utf8");
std::setlocale(LC_ALL, "");
所有人都做同样的事情。
更新2.为简单起见,宽字符串文字在这里。当以任何其他方式获得字符串时(从UTF-8转换,从二进制文件读取,...),会发生同样的事情。
答案 0 :(得分:5)
您必须使用语言环境明确地灌输输出流,如下所示:
std::wcout.imbue(std::locale());
这使事情按预期工作。事实上,标准是必需:
27.5.3.3 ios_base函数
locale getloc() const;
4如果没有嵌入语言环境,则构造时生效的全局C ++语言环境locale()的副本。
因此,当构造wcout
时,它会获得其中嵌入的初始语言环境的副本。初始语言环境为“C”。我的错误假设是没有明确嵌入的语言环境的流总是使用当前的全局语言环境(而不仅仅是在构造时)。如果考虑一下这个假设是完全不合理的。