为什么 8 位字符串文字可以包含多字节字符,而 char 向量却不能?

Jim*_*ola 2 c++ linux

我试图弄清楚为什么 8 位 char 数据类型可以包含所有这些奇怪的字符,因为它们不是前 256 个字符表的一部分。

\n
#include <iostream>\n\nint main()\n{\n    char chars[] = "    \xe5\xbf\x85   \xe8\xa5\xbf \xe2\x99\xa0 \xe2\x99\xac   \xe2\x99\xad   \xe2\x99\xae   \xe2\x99\xaf";\n    std::cout << "sizeof(char): " << sizeof(char) << " byte" << std::endl;\n    std::cout << chars << std::endl;\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

Rem*_*eau 9

8 位最多char只能保存 256 个值。但 Unicode 有数十万个字符。它们显然无法融入一个单一的char. 因此,它们必须以适合多个s 的方式进行编码 char

\n

您的编辑器/编译器可能以UTF-8编码存储示例字符串。UTF-8 中的非 ASCII 字符占用超过 1 char

\n

在您的示例中,在 UTF-8 中,大小sizeof(chars)将为55+1=56 chars (空终止符为 +1),即使您只看到 29 个“字符”(如果计算空格),其中:

\n

= 0x20(18x)
\n = 0xF0 0x9F 0x98 0x8E
\n = \ n = \n = \n = \n = \n = \n = \n = \n = \n =0xF0 0x9F 0xA5 0xB8
0xF0 0x9F 0xA4 0xA9
0xF0 0x9F 0xA5 0xB3
\xe5\xbf\x850xE5 0xBF 0x85
\xe8\xa5\xbf0xE8 0xA5 0xBF
\xe2\x99\xa00xE2 0x99 0xA0
\xe2\x99\xac0xE2 0x99 0xAC
\xe2\x99\xad0xE2 0x99 0xAD
\xe2\x99\xae0xE2 0x99 0xAE
\xe2\x99\xaf0xE2 0x99 0xAF

\n