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

145

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

而我们说ASCII是8位编码时,到底是什么意思呢?

7个回答

137

ASCII 最初确实被设计为一种 7 位编码。这是在 8 位字节普及之前完成的,甚至到了 1990 年代,你仍然可以找到一些软件,它们假定可以使用每个文本字节的第 8 位来实现自己的目的(“非 8 位干净”)。如今人们认为它是一种 8 位编码,其中字节 0x80 到 0xFF 没有定义的含义,但这是一个重构历史

有数十种文本编码使用了第八位,它们可以分为 ASCII 兼容和非兼容、固定宽度和可变宽度。ASCII 兼容意味着,无论上下文如何,值从 0x00 到 0x7F 的单个字节编码的字符与它们在 ASCII 中的编码相同。如果可能的话,您不希望与非 ASCII 兼容的文本编码有任何关系;天真的程序会以灾难性的方式对它们进行错误解释,往往破坏安全。它们如今已经过时了,以至于 HTML5 禁止在公共 Web 上使用它们,非常不幸的例外是UTF-16。我不会再多谈它们了。

固定宽度编码的意思就像它听起来的那样:所有字符都使用相同数量的字节进行编码。为了与 ASCII 兼容,固定宽度编码必须仅使用一个字节对其所有字符进行编码,因此它最多只能有 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的历史和先前的编码感兴趣,请参阅论文“字符代码的演变,1874-1968”(samizdat副本位于 http://falsedoor.com/doc/ascii_evolution-of-character-codes.pdf),然后查阅其参考文献(其中许多不可在线获取,即使拥有大学图书馆的访问权限也可能很难找到,我很遗憾)。


5
现在的ASCII码是7位还是8位呢?显然,你说它现在使用0x00-0x7F。但是我们是否要算上前导0呢? - Anurag Kalia
11
这取决于你是哪种学究。仍然正式定义ASCII(ANSI X3.4-1968)的规范将其描述为7位编码,但现在没有人再传输7位字节了,并且互操作性现在要求第八位必须为零--不能将其用作奇偶校验位或类似物。因此,在我看来,同样有效的是将ASCII描述为一种八位编码,它碰巧将其数字空间的上半部分保留为“保留,不使用”。无论哪种方式,如果您传输具有其高位设置的任何八位字节,则传输有效的ASCII。 - zwol
1
我之前无法理解这个答案,但现在它变得非常清晰易懂了。同样的ASCII一词随着时间的推移其含义也发生了改变。我的理解是正确的吗?(很抱歉回复晚了,之前没有想到。) - Anurag Kalia
1
严谨来说,现行标准是 INCITS 4-1986[R2012],因为 ASC(曾被称为 X3)演变成了 NCITS,然后是 INCITS。但是针对法语、德语、西班牙语等大约十二个重音字母的7位变体不属于 ANSI/INCITS 任何一种,而是属于 ISO/IEC 646 和 ECMA-6。而 ISO/IEC 8859-1 是 Unicode 的第一个256字符块,采用的是8位编码。 - dave_thompson_085
3
并不是每个人都像你这么拘谨,这意味着你可以找到引用“ASCII”甚至“X3.4-1968”的旧技术文档,甚至标准,意图是包括国家变体,或者至少没有明确排除它,从而导致争论。因此,如果我必须编写一个关键规范,我个人会将Unicode作为ASCII的规范参考。这就是我想要表达的全部内容。 - zwol
显示剩余6条评论

25

在Linux中,man ascii 中指出:

ASCII是美国信息交换标准代码,它是一种7位编码。


15

原始的 ASCII 表格使用7 位编码,因此它只有128个字符。

现今,大多数阅读器/编辑器使用“扩展” ASCII 表格(来自 ISO 8859-1),它使用8 位编码并具有256个字符(包括ÁÄŒéè和其他对欧洲语言有用的字符以及数学符号和其他符号)。

虽然UTF-8使用基本 ASCII 表格相同的编码方式(这意味着在两种编码中,0x41 都是 A),但它与“拉丁字母扩展-A”块不共享相同的编码。这有时会导致单词中出现奇怪的字符,例如à la carte 或者 piñata


2
以上有几个错误。Œ虽然在CP-1252中,但不是ISO 8859-1的一部分。而Latin Extended-A块也不是Unicode的前128或256个字符,它是在这些字符之后的下一个块,包含像ğ、ł和ſ这样的字母。 - Richard Smith
好观点!我想我指的是“Latin-1 Supplement”。标准,标准…… - Guillaume
3
有许多“扩展ASCII”字符集,其中只有一个是ISO 8859-1。该术语几乎没有意义,因为在编码和解码文本时,您必须知道正在使用哪个特定的字符编码(它甚至可能不是扩展ASCII字符集)。 - Tom Blodget

8
ASCII编码是7位的,但实际上,使用ASCII编码的字符并不以7位一组存储。相反,一个ASCII字符存储在一个字节中,MSB通常设置为0(是的,在ASCII中它被浪费了)。
您可以通过在文本编辑器中输入ASCII字符集中的字符串,将编码设置为ASCII,并查看二进制/十六进制来验证这一点:
enter image description here 另外:现在很少使用(严格的)ASCII编码,而更喜欢UTF-8(它不会浪费上面提到的MSB - 实际上,MSB为1表示编码点使用超过1个字节)。

0

原始的ASCII码提供了128个不同的字符,编号从0到127。 ASCII和7位是同义词。由于8位字节是常见的存储单元,因此ASCII留出了128个额外的字符,用于外语和其他符号。

但7位代码是在8位代码之前制作的。 ASCII代表美国信息交换标准代码。 在早期的互联网邮件系统中,它仅支持7位ASCII代码。

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


0

原始ASCII包含从0到127的无符号(或正)值(128个字符)。 扩展ASCII使用8位,因此具有256个可能值。以下是工作原理。

64 32 16 8 4 2 1(7位) 1 1 1 1 1 1 1 所有十进制值= 127

0 0 0 0 0 0 0 ==> 是0,因此必须加上给定的127 + 第一个(第零个值),所以总共有128个值。


-6

当我们称ASCII为7位代码时,最左边的位被用作符号位,因此使用7位,我们可以写入最多127。

这意味着从-126到127,因为ASCII的最大值是0到255。只有在将最后一位视为符号位时,才能满足7位的参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接