【问题标题】:C++ char type values are defined by OS?C++ char 类型值是由 OS 定义的吗?
【发布时间】:2012-11-19 12:49:26
【问题描述】:

我知道 char 类型的前 128 个符号是 ASCII symbols,我的意思是,如果您打印它们,它们的计算方式与 ASCII 表中的一样。现在剩下的人呢?据我了解,其他 128 个符号并未严格定义。如果我像下面这样打印所有可能的 char 值,这取决于将打印什么?

 char a = 0;
 for (int i = 0; i < 256; i++)
 {
    if (i == 128)
       cout << "------------------------------" <<endl;
    cout << a++ <<endl;
 }

我可以配置输出吗?

【问题讨论】:

  • "其他 128 个符号没有严格定义" 前 128 个也不是。(并且在术语方面是正确的,char 包含数字,而不是符号;符号可以映射到以各种方式表示数字;例如,ASCII 定义了其中一种映射)
  • “我知道 char 类型的前 128 个符号是 ASCII 符号”您确实知道仅适用于您当前的平台...

标签: c++ unicode char


【解决方案1】:

char 的前 128 个值不一定与 ASCII 字符对应。 char 的值对应于 执行字符集 中的字符,该字符集是实现定义的集合。此字符集成员的值是特定于语言环境的(第 2.3/3 节):

执行字符集成员的值和附加成员集是特定于语言环境的。

诸如'a' 之类的字符文字的类型为char,其值等于执行字符集中的字符值。对于字符串文字也是如此。如果您的文字中的字符不在实现定义的执行字符集中,则它具有实现定义的值(第 2.14.4/5 节):

如果没有这样的编码,universal-character-name 将被转换为实现定义的编码。

在许多编译器中,您可以配置执行字符集。例如,对于g++,您可以使用-fexec-charset 选项。

一旦你输出了你的文本,它的解释取决于它被查看的媒介,比如终端。

【讨论】:

    【解决方案2】:

    由于终端解释 std::cout 写入的字节,您通常可以将终端配置为将字节显示为 Latin-1、Latin-15、Cyrillic 或您想要的任何其他字符。

    在您的程序中,您无法配置它在显示屏上的显示方式。您唯一能做的就是代码如何解释字节。因此,为了使用 Latin-1,您的程序和终端都必须同意这些字节的含义是 Latin-1。

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 2015-05-24
      • 2012-03-07
      • 2013-04-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 2019-04-15
      相关资源
      最近更新 更多