为什么 8 位字符串文字可以包含多字节字符,而 char 向量不能?
Why can an 8-bit string literal contain multibyte characters while a vector of char cannot?
我想弄清楚为什么 8 位 char 数据类型可以包含所有这些奇怪的字符,因为它们不是前 256 个字符的一部分 table。
#include <iostream>
int main()
{
char chars[] = " 必 西 ♠ ♬ ♭ ♮ ♯";
std::cout << "sizeof(char): " << sizeof(char) << " byte" << std::endl;
std::cout << chars << std::endl;
return 0;
}
8 位 char
最多只能容纳 256 个值。但是 Unicode 有几十万个字符。它们显然不能放入单个 char
。因此,它们必须 编码 以适合 multiple char
s.
您的 editor/compiler 可能以 UTF-8 编码存储您的示例字符串。 Non-ASCII个UTF-8字符占1个char
.
在您的示例中,在 UTF-8 中,sizeof(chars)
的大小为 55+1=56
char
s(空终止符为 +1),即使您只看到 29 "字符”(如果算上空格),其中:
= 0x20
(18x)
</code> = <code>0xF0 0x9F 0x98 0x8E
</code> = <code>0xF0 0x9F 0xA5 0xB8
</code> = <code>0xF0 0x9F 0xA4 0xA9
</code> = <code>0xF0 0x9F 0xA5 0xB3
必
= 0xE5 0xBF 0x85
西
= 0xE8 0xA5 0xBF
♠
= 0xE2 0x99 0xA0
♬
= 0xE2 0x99 0xAC
♭
= 0xE2 0x99 0xAD
♮
= 0xE2 0x99 0xAE
♯
= 0xE2 0x99 0xAF
我想弄清楚为什么 8 位 char 数据类型可以包含所有这些奇怪的字符,因为它们不是前 256 个字符的一部分 table。
#include <iostream>
int main()
{
char chars[] = " 必 西 ♠ ♬ ♭ ♮ ♯";
std::cout << "sizeof(char): " << sizeof(char) << " byte" << std::endl;
std::cout << chars << std::endl;
return 0;
}
8 位 char
最多只能容纳 256 个值。但是 Unicode 有几十万个字符。它们显然不能放入单个 char
。因此,它们必须 编码 以适合 multiple char
s.
您的 editor/compiler 可能以 UTF-8 编码存储您的示例字符串。 Non-ASCII个UTF-8字符占1个char
.
在您的示例中,在 UTF-8 中,sizeof(chars)
的大小为 55+1=56
char
s(空终止符为 +1),即使您只看到 29 "字符”(如果算上空格),其中:
= 0x20
(18x)
</code> = <code>0xF0 0x9F 0x98 0x8E
</code> = <code>0xF0 0x9F 0xA5 0xB8
</code> = <code>0xF0 0x9F 0xA4 0xA9
</code> = <code>0xF0 0x9F 0xA5 0xB3
必
= 0xE5 0xBF 0x85
西
= 0xE8 0xA5 0xBF
♠
= 0xE2 0x99 0xA0
♬
= 0xE2 0x99 0xAC
♭
= 0xE2 0x99 0xAD
♮
= 0xE2 0x99 0xAE
♯
= 0xE2 0x99 0xAF