所以,我希望能够在我的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字符?
答案 0 :(得分:4)
使用-Wall标志编译代码时,您将看到如下警告:
警告:隐式常量转换溢出[-Woverflow] snet [2] ='我';
警告:多字符字符常量[-Wmultichar] snet 1 ='爱';
在调试模式下的Visual C ++,给出以下警告:
c:\ users \ you \ temp.cpp(9):警告C4566:由通用字符名'\ u4F60'表示的字符无法在当前代码页中表示(1252)
幕后发生的事情是你的两个字节的汉字被隐式转换为一个字符。转换溢出,因此当您在控制台中打印时,您会看到负值或奇怪的东西。
为什么这里的中文字符被允许放在char类型中?
您可以,但不应该,与定义char c = 1000000;
在C ++中应该用什么类型来容纳中文字符或非ASCII字符?
如果您想存储中文字符并且可以使用C ++ 11,请使用std :: string(live example)进行UTF-8编码。
std::string msg = u8"你爱我";