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

时间:2018-01-12 06:54:20

标签: 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
    }

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

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

在C ++中应该用什么类型来容纳中文字符或非ASCII字符?

1 个答案:

答案 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"你爱我";