我尝试使用中
,wchar_t
和char16_t
类型打印中文字符char32_t
,但未成功(live example)< / p>
#include <iostream>
int main()
{
char x[] = "中"; // Chinese character with unicode point U+4E2D
char y[] = u8"中";
wchar_t z = L'中';
char16_t b = u'\u4e2d';
char32_t a = U'\U00004e2d';
std::cout << x << '\n'; // Ok
std::cout << y << '\n'; // Ok
std::wcout << z << '\n'; // ??
std::cout << a << '\n'; // prints the decimal number (20013) corresponding to the unicode point U+4E2D
std::cout << b << '\n'; // " " "
}
答案 0 :(得分:5)
由于您在Linux系统上运行测试,因此源代码为UTF-8,这就是x
和y
相同的原因。这些字节被分流,未经修改,被std::cout << x
和std::cout << y
分配到标准输出中,当您查看网页时(或当您查看Linux终端时),您可以看到符合预期的字符。
std::wcout << z
会打印出来:
std::ios::sync_with_stdio(false);
std::wcout.imbue(std::locale("en_US.utf8"));
如果没有从C语言中取消同步,GNU libstdc ++将通过C IO流,它们在同一个流上打印一个窄字符后永远不能打印宽字符。 LLVM libc ++似乎工作甚至同步,但当然仍然需要灌输告诉流如何将宽字符转换为它发送到标准输出的字节。
要打印b
和a
,您必须将它们转换为宽或窄;即使用wbuffer_convert
设置char32_t流也是很多工作。它看起来像这样:
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv32;
std::cout << conv32.to_bytes(a) << '\n';