【问题标题】:What's the value of characters in execution character set?执行字符集中字符的值是多少?
【发布时间】:2013-05-02 13:39:33
【问题描述】:

引用自 C++03 2.2 字符集:

"基本执行字符集和基本执行 宽字符集应包含基本的所有成员 源字符集..执行成员的值 字符集是实现定义的,并且任何其他成员 是特定于语言环境的。”

据此,'A',属于执行字符集,其值是实现定义的。所以不是65(十进制'A'的ASCII码),什么?!

// Not always 65?
printf ("%d", 'A');

或者我对执行字符集中字符的有误解?

【问题讨论】:

  • 因此,如果您在使用 EBCDIC 的机器上运行,您期望 `char c = 'A'; cout
  • 只是好奇,但是有没有人看到除了 EBCDIC 或 ASCII 的扩展之外的任何东西?在 C 或 C++ 中:我熟悉在 C 出现之前使用的其他编码,但我认为从来没有使用过它们的 C 编译器。 (大多数最早的编码没有区分大小写,所以它们可能是 6 位。)
  • 'A' 的值为'A'
  • @KerrekSB:我所说的值是指“A”在只有“0”和“1”的机器上的二进制表示。它应该在上下文中澄清。
  • @Mats,哦,我只是不知道是否存在其他单独开发的 w/ASCII 编码。谢谢。

标签: c++


【解决方案1】:

当然可以是 ASCII 的 65,如果执行字符集是 ASCII 或超集(如 UTF-8)。

它没有说“它不能是 ASCII”,它说它是一种叫做“执行字符集”的东西。

【讨论】:

  • 所以我猜比较 'A' w/65 或将其 ASCII 代码写入二进制文件都不是可移植的,对吧?
  • 如果你有一个包含“原始”形式的二进制数据的文件,那么它无论如何都不是很便携。你需要知道字节顺序和其他类似的东西。如果您有一个 ASCII 文本文件并想在 EBCDIC 中使用它,则有翻译程序(例如 unix/linux dd)。
  • @Mats,我认为,与 EBCDIC 等 ASCII 对应物相比,开发人员更了解字节序;)
  • 是的,因为这是一个更常见的问题。而且我必须说我从未使用过带有 EBCDIC 的机器(至少据我所知)
  • @EricZ 除非他们在大型机上工作。 IBM 大型机仍然使用 EBCDIC。 (实际上,我不得不处理 10 多年前传入 EBCDIC 的数据;据我了解,从那时起情况就没有改变。35-40 年前,还有其他几种编码。)
【解决方案2】:

因此,该标准允许“执行字符集”是 ASCII 或 ASCII 派生词以外的其他内容。一个例子是 IBM 长期使用的 EBCDIC 字符集(可能仍然有机器使用 EBCDIC,但我怀疑过去 10-15 年构建的任何东西都不会使用它)。 EBCDIC 中的字符编码与 ASCII 完全不同。

因此,在代码中期望“A”的值是任何特定值是不可移植的。还有一大堆其他“常见假设”将失败 - A-Z 之间没有“漏洞”,并且 'A'-'a' == 32 在 EBCDIC 中都是错误的。至少字符 A-Z 的顺序是正确的! ;)

【讨论】:

  • IBM 大型机今天仍在使用 EBCDIC。 (而 FWIW:C 和 C++ 所要求的只是这 10 个数字是连续且有序的。字母表可以到处都是。如果是,本机整理顺序将是相当违反直觉的,但是,它已经是反直觉的了- 直观地让所有的大写字母排在任何小写字母之前,并且在它们之间有一些奇怪的标点符号。更不用说 ISO 8859-1 中的重音字符会发生什么。)
  • 是的,但是现在每年生产多少 IBM 大型机?
  • 和以前一样多?从未有过大量的大型机;一开始,也没有大量的其他东西。但我知道有几个地方仍然在大型机上进行大部分数据处理。对于某些类型的工作,它仍然是首选的解决方案。
  • 是的,当然,处理它的 Cobol 程序是在 1983 年编写的,并且没有太大的改变,因为这意味着转移到其他东西是一个很大的努力......;)
  • 新的 Cobol 程序还在编写中。但我怀疑有些工作最适合使用大型机。
猜你喜欢
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 2018-12-05
相关资源
最近更新 更多