#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 转换、从二进制文件读取,...),也会发生同样的事情
您必须显式地为输出流注入语言环境,如下所示:
std::wcout.imbue(std::locale());
这使得事情按预期进行。事实上,它是required按标准:
27.5.3.3 ios_base 函数
locale getloc() const;
4 如果没有注入语言环境,则全局 C++ 语言环境的副本 locale() 在构造时生效。
So when wcout
被构造后,它会获得其中注入的初始语言环境的副本。初始语言环境是“C”。我的错误假设是,没有明确注入语言环境的流始终使用当前的全局语言环境(而不仅仅是在构建时)。仔细想想,这个假设是完全不合理的。
2021 年 6 月编辑:所以理论上来说imbue
应该可以,但实际上它在 libstdc++ 中不起作用。需要设置全局区域设置才能使其工作,这可能是 libstdc++ 的一个错误。 Imbuing 可以与其他宽字符流一起使用,但不能与std::wcout
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)