为什么打印出字符“”(147、148 ascii)在 C++ 上无法按预期工作?

Why printing out the characters “” (147, 148 ascii) does not work as expected on c++?

我不明白这是怎么回事。这是用 GCC 10.2.0 编译器编译的。打印出整个字符串与打印出每个字符不同。

#include <iostream>

int main(){
   char str[] = "“”";
   std::cout << str << std::endl;
   std::cout << str[0] << str[1] << std::endl;
}

输出

“”
��

为什么输出的两条线不一样?我希望同一条线两次。打印出字母数字字符确实会输出同一行两次。

"“”" 包含的字节数比您想象的要多。它通常编码为utf8。要看到这一点,您可以打印数组的大小:

std::cout << sizeof str << '\n';

在我的测试中打印 7。 Utf8 是一种多字节编码。这意味着每个字符都以多个字节编码。现在,您正在打印 utf8 编码字符串的字节,这些字节本身是不可打印的。这就是当您尝试打印它们时得到 的原因。

请记住,在几乎所有系统上,a(有符号)char 可以容纳的最大值是 127。因此,更有可能的是,您的两个 'special' 字符实际上被编码为多字节组合。

在这种情况下,将字符串 指针 传递给 std::cout 将继续从该缓冲区提供数据,直到遇到零(空终止符)字节。此外,在您的系统上,std::cout 流似乎可以正确解释多字节字符序列,因此它显示了预期的字符。

但是,当您将单个 char 元素作为 str[0]str[1] 传递时,无法将这些参数解析为多字节字符的组成部分:每个都是解释 'as-is',并且这些值不对应于有效的可打印字符,因此显示 'weird' 符号。