ASCII

来自GSXAB的知识库
ASCII
术语名称 ASCII
英语名称 ASCII
别名 US-ASCII, ASCII码, 美国信息交换标准代码, 美国标准信息交换码, American Standard Code for Information Interchange

ASCII[1] 是一种常见字符编码,也指这种字符编码中的字符集。 ASCII 字符集中仅含有 128 个字符,以固定方式分配在由 7 个二进制位(比特)构成的 128 个码位上。

在不同场景下, ASCII 有多种不同别名,如 US-ASCII , ISO646-US (见ISO 646)等。有时 ASCII 也会被误用于其他兼容 ASCII 的字符编码,特别是扩展 ASCIIISO 8859 系列及基本符合 ISO 646 中 IRV 兼容的任意编码。习惯上,“ASCII 码”一词经常被滥用作“二进制字符编码”的同义词,泛指任意字符编码。

ASCII 标准初发布于 1963 年,有 28 个未分配字符,后续 1967 年、 1968 年、 1977 年与 1986 年有过修订,并形成了现在的标准。

字符集特征

ASCII 编码包含 33 个控制字符以及美式 qwerty 键盘布局中全部可见字符,其中包括阿拉伯数字 0~9 及大小写字母 A~Z 及 a~z 。

ASCII 被设计于电传打字机时代,其控制字符起源于打字机控制操作,其中大部分字符已经随着相关技术退出主流而不再常用,但是仍有部分控制字符仍保留在现代使用。

由于编码空间能容纳的字符总数限制, ASCII 仅覆盖了最少量的数字、英语字母及必要标点,这导致其缺少了必要的符号,比如:

  • 其仅用一个码位编码了“傻瓜引号(dummy quote)”同时作为前后双引号 " ,而没有使用“智能引号(smart quote)” “”
  • 作为发源于美国的字符编码,仅编码了美元符号 $ 作为货币符号,而缺少了美分符号 ¢
  • 无法支持英语中带有附加符号的字母,如 éñ 等,以及全部使用分音符的元音字母。

编码特征

整体特征

ASCII 编码范围为 7 比特。 BCD 码催生了四比特数字,进而催生了八位作为传输单元。 早年希望一同传输校验码,因此产生了 1 位校验码 7 位数据的格局。

ASCII 码分区遵循十六进制安排,以兼容 BCD8421 码,并直接将区块按十六进制对齐, 这些使得部分字符间存在明显位运算关系,且可以通过位运算迅速判定字符分类,这一安排影响了后世大量字符编码系统。

历史遗留字符

全 0 表示空字符,全 1 表示擦除字符,这反映了打孔纸带时代的惯例: 空字符表示什么也不做,而擦除字符表示这个地方之前打孔有误,把这个单元全部孔打掉以示擦除,也处理为什么都不做。

位编码的码位安排

最高位区分字符所处区块,当最高两位为 0 时是控制字符,全 1 时是控制字符,否则就是普通的打印字符。

空格排在最前面,然后 21H 开始依次排列打字机键盘中常在数字换档键的字符,与现代英式 qwerty 键盘中数字上档键前一部分相同,美式 qwerty 键盘由于单双引号安排在一起, Shift+2" 变成了 @

30H 开始排列数字,且数字的低 4 位与其 BCD 码相同。这使得判定前 3 位后可以兼容地发送给仅处理 4 位 BCD8421 的机器。

HEX 3? = BIN 0011 ????

41H61H 开始排列拉丁字母,且其低 5 bit 与字母在英语字母表中的顺序相同。可以看作一个固定前缀加一位大小写,然后是字母顺序的 5 位编码。

HEX 4?~5? = BIN 010? ????

HEX 6?~7? = BIN 011? ????

码表

ASCII[2][3][4]
- _0
??? 0000
_1
??? 0001
_2
??? 0010
_3
??? 0011
_4
??? 0100
_5
??? 0101
_6
??? 0110
_7
??? 0111
_8
??? 1000
_9
??? 1001
_A
??? 1010
_B
??? 1011
_C
??? 1100
_D
??? 1101
_E
??? 1110
_F
??? 1111
0_
000 ????
NUL
空字符
SOH
标题开始[5]
STX
正文开始[6]
ETX
正文结束[6]
EOT
传输结束
ENQ
查询
ACK
确认
收到应答
BEL
响铃[7]
BS
退格[8]
HT
水平制表
TAB
制表符[9]
LF
NL
EOL
换行[10]
VT
垂直制表[11]
FF
NP
换页[12]
CR
回车[13]
SO
LS1
移出[14]
SI
LS0
移入[14]
1_
001 ????
DLE
数据链路转义[15]
DC1
设备控制 1
XON
传输开始
DC2
设备控制 2
DC3
设备控制 3
XOFF
传输中断
DC4
设备控制 4
NAK
拒绝
否定应答
SYN
同步空闲
ETB
传输块结束
CAN
取消
EM
介质结束[16]
SUB
代替
ESC
换码
转义字符
溢出
FS
文件分隔符[17]
GS
组分隔符[17]
RS
记录分隔符[17]
US
单元分隔符[17]
2_
010 ????
SP
空格
! " # $ % & ' ( ) * + , - . /
3_
011 ????
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4_
100 ????
@ A B C D E F G H I J K L M N O
5_
101 ????
P Q R S T U V W X Y Z [ \ ] ^ _
6_
110 ????
` a b c d e f g h i j k l m n o
7_
111 ????
p q r s t u v w x y z { | } ~ DEL
擦除字符

使用

ASCII 编码几乎无处不在。很多协议(特别是需要兼容性以及出现较早的协议)都要求 ASCII 编码,但是面对用户的情况下又几乎不实际使用,因为 ASCII 支持字符过于有限,几乎所有应用场景中都在使用与 ASCII 兼容的某种扩展编码,而不使用 ASCII 本身。 扩展 ASCII 、 ISO 8859 系列的编码,以及符合 ISO 646 的编码,以及中文环境中常用的 GB 2312 系列编码、现代常用的 UTF-8 编码,都保证在 0~127 的编码范围内与 ASCII 兼容。

由于 ASCII 最常用于输入,字符集缺陷甚至反向影响了文本。不便于输入甚至可能构成了英语中附加符号使用减少的一个因素;大部分字体中会区分成对的尖括号和大小于号,但是 ASCII 中的混用,导致哪怕后续字符集往往区分这两对字符,也不会被区分使用。


常见字符编码
早期编码 电报码、 BCD 、ASCIIISO 646
ISO 8859 ISO 8859-1 、 ISO 8859-2 、……
各国国家标准及代码页 GB 2312GBKGB 18030
Unicode / ISO 10646 UTF-7 、 UTF-8、 UTF-16 、 UTF-32
  1. ASCII [ˈæs.kiː] ,中 [ä.sz̩.kɤ] 。全称为 American Standard Code for Information Interchange ,译为美国信息交换标准代码,全称只用于解释这个词语,通常使用中只使用缩写。
  2. https://en.wikipedia.org/wiki/ASCII#Character_set
  3. https://blog.csdn.net/weixin_40948750/article/details/121228437
  4. https://baike.baidu.com/item/ASCII/309296
  5. 消息的开始。
  6. 6.0 6.1 正文的开始和结束。
  7. 使蜂鸣器发出声音。一般是打字机外设的蜂鸣器,现在主板不一定安装此类外设。
  8. 打印头向左回退一个位置。打字机上用于将同一个字符重复打印以强调,或将附加符号打印到字母同一个位置上。在 CRT 时代无效,现代则演变变为了回退位置并删除这个位置字符的退格键。
  9. 打印头移动到下一个水平制表位。控制输出设备到下一个预定义的表格位置,具体位置是灵活的,通常为左侧起每 4 个空格的位置。
  10. 打印头移动到下一行。打字机时代只将打印头向下一行,而不移动到行首(CR)。现代在部分系统中代替 CRLF 。
  11. 打印头移动到下一个垂直制表位。
  12. 打字机打印头移动到下一页,或者换纸。
  13. 打印头移动到行首,但是不移动到下一行(LF)。现代在部分系统中代替 CRLF 。
  14. 14.0 14.1 移出、移入打字机的彩色纸带、备用字符集等。
  15. 标记需要对接下来的数据流做某种转义。
  16. 指存储介质逻辑上到达末端,已被写满。
  17. 17.0 17.1 17.2 17.3 最初用于打孔纸带、磁带等顺序存储介质中分隔数据控制字符。分别对应于分割文件、数据表、数据记录、数据单元(单元格,今称字段)。