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

Fra*_*uet 5 c++ cout c++14

我正在尝试?使用类型打印中文字符wchar_t,char16_t并且char32_t没有成功(实例)

#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';     //             "                    "                   "
}
Run Code Online (Sandbox Code Playgroud)

Cub*_*bbi 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"));
Run Code Online (Sandbox Code Playgroud)

如果没有从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';
Run Code Online (Sandbox Code Playgroud)

把它们放在一起:http://coliru.stacked-crooked.com/a/a809c38e21cc1743