为什么字符数组接受C++中的非 ASCII 字符?

Why do character arrays accept non ASCII characters in C++?

本文关键字:字符 ASCII C++ 数组 为什么      更新时间:2023-10-16

所以,我希望能够在我的C++程序中使用中文字符,我需要使用某种类型来保存超出ASCII范围的此类字符。

但是,我尝试运行以下代码,它起作用了。

#include <iostream>
int main() {
char snet[4];
snet[0] = '你';
snet[1] = '爱';
snet[2] = '我';
std::cout << snet << std::endl;
int conv = static_cast<int>(snet[0]);
std::cout << conv << std::endl; // -96
}

这没有意义,因为 C++ 中的sizeof(char),因为 g++ 编译器的计算结果为 1,但中文字符不能用单个字节表示。

为什么这里的汉字被允许装在char体中?

应该使用什么类型来容纳C++中的汉字或非 ASCII 字符?

当您使用 -Wall 标志编译代码时,您将看到如下警告:

警告:隐式常量转换中的溢出 [-Woverflow] snet[2] = '我';

警告:多字符字符常量 [-Wmultichar] snet1 = '爱';

调试模式下的可视C++会给出以下警告:

c:\users\you\temp.cpp(9): 警告 C4566:在当前代码页中无法表示由通用字符名称"\u4F60"表示的字符 (1252)

幕布下发生的事情是,您的两个字节汉字被隐式转换为字符。该转换溢出,因此当您在控制台中打印它时,您会看到负值或奇怪的内容。

为什么这里的汉字被允许以字符形式容纳?

你可以,但你不应该,就像你可以定义char c = 1000000;

应该使用什么类型来容纳C++中的汉字或非 ASCII 字符?

如果要存储中文字符并且可以使用 C++11,请使用 std::string 进行 UTF-8 编码(实时示例)。

std::string msg = u8"你爱我";