为什么打印出字符“”(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' �
符号。
我不明白这是怎么回事。这是用 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' �
符号。