C++:打印unicode字符

not*_*orb 0 c++ unicode

我编写了一个简单的程序来打印 unicode 微笑表情符号。不幸的是,打印了其他东西。有谁知道这段代码有什么问题吗?谢谢

\n\n
#include <iostream>\n#include <string>\nusing namespace std;\n\nint main(int argc, char *argv[])\n{\n    string str = u8"\\u1F600";\n\n    cout << str << endl;\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

编译及输出:

\n\n
g++ -pedantic -Wall test109.cc && ./a.out\n\xe1\xbd\xa00\n
Run Code Online (Sandbox Code Playgroud)\n

Rem*_*eau 5

转义\\u序列最多限制为 4 个十六进制数字,因此"\\u1F600"被解析为两个单独的字符\\u1F60( \xe1\xbd\xa0) 和0,这正是您在控制台输出中看到的内容。

\n\n

代码点U+1F60 GREEK SMALL LETTER OMEGA AND PSILI与代码点U+1F600 GRINNING FACE有很大不同。

\n\n

对于您正在尝试的内容,您需要使用\\U转义符,它最多允许 8 个十六进制数字:

\n\n
string str = u8"\\U0001F600";\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,您可以使用其中之一:

\n\n
string str = u8"\\xF0\\x9F\\x98\\x80"; // UTF-8 codeunits in hex format\n
Run Code Online (Sandbox Code Playgroud)\n\n
string str = u8"\\360\\237\\230\\200"; // UTF-8 codeunits in octal format\n
Run Code Online (Sandbox Code Playgroud)\n\n
string str = u8""; // if your compiler/editor allows this\n
Run Code Online (Sandbox Code Playgroud)\n