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

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字符?

Fra*_*101 4

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

\n\n
\n

警告:隐式常量转换中溢出 [-Woverflow]\n snet[2] = \'\xe6\x88\x91\';

\n\n

警告:多字符字符常量 [-Wmultichar]\n snet 1 = \'\xe7\x88\xb1\';

\n
\n\n

Visual C++ 在调试模式下,给出以下警告:

\n\n
\n

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

\n
\n\n

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

\n\n
\n

为什么这里的汉字被允许存放在 char 类型中?

\n
\n\n

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

\n\n
\n

C++ 中应该使用什么类型来存放汉字或非 ASCII 字符?

\n
\n\n

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

\n\n
std::string msg = u8"\xe4\xbd\xa0\xe7\x88\xb1\xe6\x88\x91"; \n
Run Code Online (Sandbox Code Playgroud)\n