Jos*_*ein 5 c++ string unicode
所以,我希望能够在我的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
}
Run Code Online (Sandbox Code Playgroud)
这是没有意义的,因为sizeof(char)在C++中,对于g ++编译器,求值为1,但中文字符不能用单个字节表示.
为什么这里的汉字被允许被安置在一个char类型?
在C++中应该使用什么类型来容纳中文字符或非ASCII字符?
当您使用 -Wall 标志编译代码时,您将看到如下警告:
\n\n\n\n\n警告:隐式常量转换中溢出 [-Woverflow]\n snet[2] = \'\xe6\x88\x91\';
\n\n警告:多字符字符常量 [-Wmultichar]\n snet 1 = \'\xe7\x88\xb1\';
\n
Visual C++ 在调试模式下,给出以下警告:
\n\n\n\n\nc:\\users\\you\\temp.cpp(9): 警告 C4566: 通用字符名 \'\\u4F60\' 表示的字符无法在当前代码页中表示 (1252)
\n
幕后发生的事情是,您的两个字节中文字符被隐式转换为字符。该转换会溢出,因此当您在控制台中打印它时,您会看到负值或奇怪的东西。
\n\n\n\n\n为什么这里的汉字被允许存放在 char 类型中?
\n
可以,但不应该,就像定义一样char c = 1000000;
\n\n\nC++ 中应该使用什么类型来存放汉字或非 ASCII 字符?
\n
如果你想存储中文字符并且可以使用 C++11,请使用 std::string 进行 UTF-8 编码(实例)。
\n\nstd::string msg = u8"\xe4\xbd\xa0\xe7\x88\xb1\xe6\x88\x91"; \nRun Code Online (Sandbox Code Playgroud)\n