我的老师告诉我ASCII是一个8位字符编码方案。但它仅为0-127代码定义,这意味着它可以适合7位。所以难道不能说ASCII实际上是7位编码吗?
而我们说ASCII是8位编码时,到底是什么意思呢?
我的老师告诉我ASCII是一个8位字符编码方案。但它仅为0-127代码定义,这意味着它可以适合7位。所以难道不能说ASCII实际上是7位编码吗?
而我们说ASCII是8位编码时,到底是什么意思呢?
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),然后查阅其参考文献(其中许多不可在线获取,即使拥有大学图书馆的访问权限也可能很难找到,我很遗憾)。
原始的 ASCII 表格使用7 位编码,因此它只有128个字符。
现今,大多数阅读器/编辑器使用“扩展” ASCII 表格(来自 ISO 8859-1),它使用8 位编码并具有256个字符(包括Á、Ä、Œ、é、è和其他对欧洲语言有用的字符以及数学符号和其他符号)。
虽然UTF-8使用基本 ASCII 表格相同的编码方式(这意味着在两种编码中,0x41
都是 A),但它与“拉丁字母扩展-A”块不共享相同的编码。这有时会导致单词中出现奇怪的字符,例如à la carte 或者 piñata。
原始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个值。
当我们称ASCII为7位代码时,最左边的位被用作符号位,因此使用7位,我们可以写入最多127。
这意味着从-126到127,因为ASCII的最大值是0到255。只有在将最后一位视为符号位时,才能满足7位的参数。