所以,我希望能够在我的 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
}
这是没有意义的,因为自从sizeof(char)
在C++中,g++编译器计算结果为1,但汉字不能用单个字节表示。
为什么这里的汉字被允许存放在一个char
type?
C++ 中应该使用什么类型来存放汉字或非 ASCII 字符?
当您使用 -Wall 标志编译代码时,您将看到如下警告:
警告:隐式常量转换中溢出 [-Woverflow]
snet[2] = '我';
警告:多字符字符常量 [-Wmultichar]
网络1 http://coliru.stacked-crooked.com/a/9a94db541143983e = '爱';
Visual C++ 在调试模式下,给出以下警告:
c:\users\you\temp.cpp(9): 警告 C4566: 通用字符名 '\u4F60' 表示的字符无法在当前代码页中表示 (1252)
幕后发生的事情是,您的两个字节中文字符被隐式转换为字符。该转换会溢出,因此当您在控制台中打印它时,您会看到负值或奇怪的东西。
为什么这里的汉字被允许存放在 char 类型中?
你可以,但你不应该,就像你定义的那样char c = 1000000;
C++ 中应该使用什么类型来存放汉字或非 ASCII 字符?
如果你想存储中文字符并且可以使用 C++11,请使用 std::string 进行 UTF-8 编码(活生生的例子 http://coliru.stacked-crooked.com/a/9a94db541143983e).
std::string msg = u8"你爱我";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)