我的老师告诉我 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 没有定义的含义,但这是一个retcon。
有几十种使用第 8 位的文本编码;它们可以分为与 ASCII 兼容或不兼容,以及固定宽度或可变宽度。ASCII 兼容意味着无论上下文如何,具有从 0x00 到 0x7F 值的单个字节对它们在 ASCII 中的相同字符进行编码。如果可以避免的话,您不想与非 ASCII 兼容的文本编码有任何关系;期待 ASCII 的幼稚程序往往会以灾难性的、经常破坏安全的方式误解它们。如今它们已被弃用,以至于(例如)HTML5 禁止在公共 Web 上使用它们,不幸的是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 的历史及其之前的编码感兴趣,请从论文“字符代码的演变,1874-1968”开始(samizdat 副本位于http://falsedoor.com/doc/ascii_evolution-of- character-codes.pdf),然后寻找它的参考资料(我很遗憾地说,其中许多都不能在线获得,即使可以访问大学图书馆也可能很难找到)。
在 Linux 上man ascii
说:
ASCII 是美国信息交换标准代码。它是一个 7 位代码。
原始的 ASCII 表是7 位编码的,因此它有 128 个字符。
如今,大多数读者/编辑使用“扩展”ASCII 表(来自ISO 8859-1),该表以8 位编码,包含 256 个字符(包括Á、Ä、Œ、é、è和其他对欧洲语言有用的字符以及数学字形和其他符号)。
虽然UTF-8使用与基本 ASCII 表相同的编码(在两种代码中0x41
都是A),但它对于“Latin Extended-A”块并不共享相同的编码。这有时会导致奇怪的字符出现在à la carte或piñata等单词中。
原始的 ASCII 码提供了 128 个不同的字符,编号从 0 到 127。ASCII 和 7 位是同义词。由于 8 位字节是通用存储元素,ASCII 为 128 个附加字符留出了空间,这些字符用于外语和其他符号。
但是 7 位代码是在 8 位代码之前制作的。ASCII 代表美国信息交换标准代码。在早期的 Internet 邮件系统中,它只支持 7 位 ASCII 码。
这是因为它可以在这样的系统上执行程序和多媒体文件。这些系统使用 8 位字节,但随后必须使用MIME、uucoding和BinHex等编码方法将其转换为 7 位格式。这意味着 8 位字符已转换为 7 位字符,这会增加额外的字节来对它们进行编码。
当我们将 ASCII 称为 7 位代码时,最左边的位用作符号位,因此使用 7 位我们最多可以写入 127。
这意味着从-126到127,因为ASCII的最大值是0到255。如果最后一位被认为是符号位,则只有7位的参数才能满足。