ASCII码是7位还是8位?


100

我的老师告诉我ASCII是8位字符编码方案。但是它仅针对0-127码进行定义,这意味着它可以适合7位。那么,难道说ASCII位实际上是7位代码吗?

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

Answers:


90

ASCII确实最初被认为是7位代码。在8位字节无处不在之前,这已经做得很好,甚至在1990年代,您都可以找到一种软件,该软件假定它可以将文本的每个字节的8位用于其自身目的(“非8位纯净”)。如今,人们将其视为8位编码,其中字节0x80至0xFF没有定义的含义,但这是一个retcon

有许多使用第8位的文本编码。它们可以分为与ASCII兼容和不与ASCII兼容,以及固定宽度或可变宽度。兼容ASCII的意思是,无论上下文如何,值从0x00到0x7F的单个字节都编码与ASCII中相同的字符。如果可以避免,您不希望与非ASCII兼容的文本编码有任何关系。期望ASCII的幼稚程序往往会以灾难性的,通常是破坏安全性的方式来误解它们。如今,它们已被弃用,例如(不幸的是)UTF-16例外,HTML5禁止在公共Web上使用它们。我不再谈论它们了。

固定宽度编码意味着听起来像:所有字符都使用相同数量的字节进行编码。为了与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”(http://falsedoor.com/doc/ascii_evolution-of- character-codes.pdf),然后追逐它的参考文献(我很遗憾地说,其中许多参考文献都无法在线获得,即使访问大学图书馆也可能很难找到)。


1
那么ASCII noawadays是7位还是8位?显然,您说它现在使用0x00-0x7F。但是,我们是否计算前导0?
Anurag Kalia

8
那取决于你是哪种学究。仍然正式定义ASCII的规范(ANSI X3.4-1968)将其描述为7位编码,但是没有人再发送7位字节,并且如今的互操作性要求第八位必须为零-您不能用于奇偶校验位或类似位。因此,将ASCII描述为八位编码,恰好将其数字空间的上半部分保留为“保留,不使用”,同样是IMNSHO。不管采用哪种方式,如果您传输的8位字节中的任何一个都设置了高位,那么您就不会传输有效的ASCII码。
zwol

1
(...但是您可能正在传输有效的其他内容,例如UTF-8或ISO 8859-1或KOI8-R。)
zwol

1
实际上,该标准现在是INCITS 4-1986 [R2012],因为以前称为 X3的ASC 突变为NCITS,然后是INCITS。但是带有法语,德语,西班牙语等重音字母的7位变体不是ANSI / INCITS,而是ISO / IEC 646和ECMA-6。它是8位(ISO / IEC)8859-1,形成了Unicode的第一个256个字符的块。
dave_thompson_085

2
@ dave_thompson_085并非每个人都像您一样学究-这意味着您可以找到较旧的技术文档,甚至是引用“ ASCII”或什至“ X3.4-1968”的标准,旨在包括国家或地区名称,至少没有清楚地排除它,导致争论。因此,如果我不得不在重要的地方编写规范,我个人将使用Unicode作为ASCII的规范性参考。这就是我的意思。
zwol

14

在Linux上man ascii说:

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


9

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

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

尽管UTF-8使用与基本ASCII表相同的编码(在两个代码中均0x41表示A),但对于“ Latin Extended-A”块而言,它不共享相同的编码。有时会导致奇怪的字符出现在点菜piñata之类的单词中。


上面有几个错误。CP虽然在CP-1252中,但不是ISO 8859-1的一部分。而且Latin Extended-A块不是Unicode的前128个或256个字符:它是包含ğ,ł和letters等字母的下一个块。
理查德·史密斯

好点子!我想我的意思是“ Latin-1补充剂”。Standards standard ...
Guillaume

1
有许多“扩展ASCII”字符集,其中只有一个是ISO 8859-1。该术语几乎没有意义,因为在编码和解码文本时,您必须知道正在使用哪种特定的字符编码(甚至可能不是扩展ASCII字符集)。
汤姆·布洛杰特'18

2

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

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

除了:使用(严格)的ASCII编码的现在已是屡见不鲜,有利于UTF-8的(它浪费MSB上述-事实上,为1的MSB指示码点被编码具有超过1个字节)。


0

原始ASCII代码提供了128个不同的字符,编号为0到127。ASCII7位是同义的,因为8位字节是公用存储元素,所以ASCII留出了128个用于外语和其他符号的附加字符的空间。但是7位代码最初是在8位代码之前制作的。ASCII代表美国信息交换标准码在早期的Internet邮件系统中,它仅支持7位ASCII码,这是因为它随后可以通过吮吸系统执行程序和多媒体文件。这些系统使用8位字节,但是随后必须使用MIME,UUcoding和BinHex等编码方法将其转换为7位格式。这意味着8位已被转换为7位字符,这增加了额外的字节来对它们进行编码。


-3

当我们将ASCII称为7位代码时,最左边的位用作符号位,因此使用7位,我们最多可以写入127。这意味着-126至127,因为ASCII的最大阿am值为0至255。这可以是如果最后一位被视为符号位,则仅对7位的参数感到满意


角色如何显示符号?
Oleh Misarosh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.