ASCII 码实际上是7位还是8位?

我的老师告诉我 ASCII 是一个8位字符编码方案。但是它只定义了0-127个代码,这意味着它可以被安装到7位。所以 ASCII 实际上是一个7位代码,这难道不是一个争论的焦点吗?

当我们说 ASCII 是一个8位代码的时候,我们到底想说什么?

159525 次浏览

在 Linux man ascii上写道:

AScII 是 ASCII,是7位代码。

ASCII 最初确实被设想为一个7位代码。在8位字节变得无处不在之前,这项工作已经做得很好了,甚至到了20世纪90年代,你可以找到一种软件,假定它可以为了自己的目的使用每个字节的8位(“不是8位干净”)。现在人们把 想想看当作8位编码,其中字节0x80到0xFF 没有定义的意思,但那是 视网膜病变

使用第8位的文本编码有几十种; 它们可以分为 ASCII 兼容与否、固定宽度或可变宽度。ASCII 兼容意味着 不管上下文如何,单个字节,值从0x00到0x7F,编码与 ASCII 中相同的字符。如果可能的话,您不希望与不兼容 ASCII 的文本编码有任何关系; 期望使用 ASCII 的幼稚程序往往会以灾难性的、通常会破坏安全的方式误解它们。如今,它们已经过时了,以至于(例如) HTML5禁止在公共 Web 上使用它们,令人遗憾的是,除了 UTF-16以外。我不会再谈论他们了。

固定宽度编码的意思就像它听起来的那样: 所有字符都使用相同数量的字节进行编码。为了与 ASCII 兼容,固定-with 编码必须只使用一个字节对其所有字符进行编码,因此它的字符数不能超过256个。现在最常见的这种编码是 视窗 -1252,它是 ISO 8859-1的一个扩展。

目前只有一种与 ASCII 兼容的可变宽度编码方式值得了解,但它非常重要: UTF-8,它将所有 Unicode 打包成与 ASCII 兼容的编码方式。如果你能做到的话,你真的很想用这个。

最后,“ ASCII”现在的 很实际定义来自 Unicode,而不是它最初的标准(ANSI X3.4-1968) ,因为历史上 ASCII 的127个字符有几十种变体——例如,一些标点符号可能被重音字母替换,以方便法语文本的传输。所有这些变化都过时了,当人们说“ ASCII”时,他们的意思是字节值从0x00到0x7F 编码 Unicode 编码点 U + 0000到 U + 007F。这可能只有在您发现自己正在编写一个技术标准时才对您有意义。

如果你对 ASCII 的历史和之前的编码感兴趣,可以从《字符代码的进化,1874-1968》(http://falsedoor.com/doc/ascii_evolution-of-character-codes.pdf的地下出版物)这篇论文开始,然后追踪它的参考文献(我很遗憾地说,很多参考文献在网上找不到,甚至连大学图书馆都很难找到)。

原始的 ASCII 表是在 7比特上编码的,因此它有128个字符。

现在,大多数读者/编辑使用“扩展的”ASCII 表(来自 ISO 8859-1 ) ,它编码在 8比特上,有256个字符(包括 再见谢谢是的是的和其他欧洲语言有用的字符,以及数学符号和其他符号)。

虽然 UTF-8使用与基本 ASCII 表相同的编码(这意味着 0x41在两个代码中都是 A) ,但是它不共享“ LatinExtended-A”块的相同编码。这有时会导致奇怪的字符出现在像 点菜皮纳塔这样的单词中。

最初的 ASCII 代码提供了128个编号为0到127的不同字符。ASCII 和7位是同义的。由于8位字节是常见的存储元素,ASCII 为128个用于外语和其他符号的额外字符留出了空间。

但是7位代码是在8位代码之前制作的,ASCII 代表 ASCII。 在早期的因特网邮件系统中,它只支持7位 ASCII 码。

这是因为它可以在这样的系统上执行程序和多媒体文件。这些系统使用8位的字节,但随后必须使用编码方法(如 哑剧(咒语)BinHex)将其转换成7位格式。这意味着8位字符已经转换为7位字符,这将增加额外的字节来对它们进行编码。

当我们称 ASCII 为7位代码时,最左边的位用作符号位,所以7位可以写到127位。

这意味着从 -126到127,因为 ASCII 的最大值是0到255。如果最后一个位被认为是符号位,那么只有7位的参数才能满足这个要求。

ASCII 编码是7位的,但实际上,用 ASCII 编码的字符并不存储在7位的组中。相反,一个 ASCII 存储在一个字节中,MSB 通常设置为0(是的,它在 ASCII 中被浪费了)。

您可以通过在文本编辑器中的 ASCII 字符集中输入一个字符串、将编码设置为 ASCII 并查看二进制/十六进制文件来验证这一点:
enter image description here

旁白: (严格地) ASCII 编码的使用现在是不常见的,有利于 UTF-8(这确实是 没有浪费了上面提到的 MSB-事实上,MSB 为1表示代码点的编码超过1字节)。