我尝试使用类型wchar_t,char16_t和char32_t打印中文字符无济于事。

时间:2015-07-22 18:40:39

标签: c++ c++14 cout

我尝试使用wchar_tchar16_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';     //             "                    "                   "
}

1 个答案:

答案 0 :(得分:5)

由于您在Linux系统上运行测试,因此源代码为UTF-8,这就是xy相同的原因。这些字节被分流,未经修改,被std::cout << xstd::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 ++似乎工作甚至同步,但当然仍然需要灌输告诉流如何将宽字符转换为它发送到标准输出的字节。

要打印ba,您必须将它们转换为宽或窄;即使用wbuffer_convert设置char32_t流也是很多工作。它看起来像这样:

std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv32;
std::cout << conv32.to_bytes(a) << '\n';

全部放在一起:http://coliru.stacked-crooked.com/a/a809c38e21cc1743