ASCII码是7位还是8位?

Anu*_*lia 90 ascii character-encoding

我的老师告诉我ASCII是8位字符编码方案.但它仅定义为0-127个代码,这意味着它可以适合7位.那么不能说ASCII位实际上是7位代码吗?

当说ASCII完全是8位代码时,我们要说什么呢?

zwo*_*wol 78

ASCII确实最初被认为是一个7位代码.这在8位字节无处不在之前就已经完成了,甚至到了20世纪90年代,你也可以找到软件,假设它可以使用每个文本字节的第8位用于它自己的目的("不是8位清理").如今人们认为它是一个8位编码,其中字节0x80到0xFF没有明确的含义,但这是一个retcon.

有许多文本编码使用第8位; 它们可以被分类为ASCII兼容与否,以及固定宽度或可变宽度.ASCII兼容意味着无论上下文如何,具有0x00到0x7F值的单个字节编码与ASCII中相同的字符.如果你可以避免它,你不希望与非ASCII兼容的文本编码有任何关系; 期待ASCII的天真程序倾向于以灾难性的,通常是破坏性的方式误解它们.现在它们已被弃用(例如)HTML5禁止在公共网站上使用它们,但不幸的是UTF-16除外.我不打算再谈论它们了.

固定宽度编码意味着它的含义:所有字符都使用相同的字节数进行编码.要与ASCII兼容,fixed-with编码必须仅使用一个字节对其所有字符进行编码,因此它不能超过256个字符.目前最常见的此类编码是Windows-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的历史及其之前的编码感兴趣,请从文章"The Character of Character Codes,1874-1968"开始(samizdat copy at http://falsedoor.com/doc/ascii_evolution-of- character-codes.pdf)然后追逐它的引用(其中很多都不能在线获取,即使访问大学图书馆也很难找到,我很遗憾地说).

  • 这取决于你是什么样的学究.仍然正式定义ASCII(ANSI X3.4-1968)的规范将其描述为7位编码,但没有人再发送7位字节,现在互操作性要求第8位必须为零 - 你不能将它用于奇偶校验位或类似位.因此,同样有效的IMNSHO将ASCII描述为8位编码,恰好将其数字空间的上半部分保留为"保留,不使用".无论哪种方式,如果你发送任何高位设置的8位字节,你就不会*传输有效的ASCII. (8认同)
  • 那么现在 ASCII 是 7 位还是 8 位?你说它现在使用 0x00-0x7F,显然。但是我们计算前导0吗? (3认同)
  • @ dave_thompson_085不是每个人都像你一样迂腐 - 这意味着你可以找到更老的技术文档,甚至标准,引用"ASCII",甚至"X3.4-1968",打算*包括*国家变体,或者至少没有明确地排除它,导致争论.因此,如果我必须编写一个重要的规范,我个人会使用Unicode作为ASCII的规范参考.这就是我的意思. (2认同)

Ben*_*ela 13

在Linux上man ascii说:

ASCII是美国信息交换标准代码.它是一个7位代码.


Gui*_*ume 9

原始ASCII表以7位编码,因此它有128个字符.

如今,大多数读者/编辑使用"扩展"ASCII表(来自ISO 8859-1),该表以8位编码,享有256个字符(包括Á,Ä,Œ,é,è和其他对欧洲语言有用的字符)作为数学字形和其他符号).

虽然UTF-8使用与基本ASCII表相同的编码(两个代码中的含义0x41均为A),但它不会为"Latin Extended-A"块共享相同的编码.这有时会导致奇怪的角色出现在点菜皮纳塔等字眼中.

  • 有许多“扩展 ASCII”字符集,其中只有 ISO 8859-1 之一。该术语几乎毫无意义,因为当您对文本进行编码和解码时,您必须知道正在使用哪种特定字符编码(甚至可能不适用于扩展 ASCII 字符集)。 (3认同)
  • 上面有几个错误。Œ 不是 ISO 8859-1 的一部分,尽管它位于 [CP-1252](https://en.wikipedia.org/wiki/Windows-1252) 中。[Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) 块不是 Unicode 的前 128 或 256 个字符:它是包含 ğ、ł 等字母之后的下一个块和ſ。 (2认同)

flo*_*w2k 8

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

您可以通过在文本编辑器中输入 ASCII 字符集中的字符串,将编码设置为 ASCII,然后查看二进制/十六进制来验证这一点:
在此输入图像描述

旁白:现在使用(严格的)ASCII 编码并不常见,而是使用 UTF-8(这不会浪费上面提到的 MSB - 事实上,MSB 为 1 表示代码点使用超过 1 个字节进行编码)。