字符编码之三:字符编码的由来
作者:Jacky Lin 原文:刨根究底字符编码之三——字符编码的由来
一、为什么需要对字符进行编码
1.
计算机一开始发明出来时是用来解决数字计算问题的,后来人们发现,计算机还可以做更多的事,例如文本处理。
但计算机其实挺笨的,它只“认识” 010110111000… 这样由 0 和 1 两个数字组成的二进制数字,这是因为计算机的底层硬件实现就是用电路的开和闭两种状态来表示 0 和 1 两个数字的。因此,计算机只可以直接存储和处理二进制数字。
2.
为了在计算机上也能表示、存储和处理像文字、符号等等之类的字符,就必须将这些字符转换成二进制数字。
当然,肯定不是我们想怎么转换就怎么转换,否则就会造成同一段二进制数字在不同计算机上显示出来的字符不一样的情况,因此必须得定一个统一的、标准的转换规则。
二、EBCDIC 码与 ASCII 码
1.
于是最开始出现了 EBCDIC(Extended Binary Coded Decimal Interchange Code扩展二进制编码的十进制交换码)编码标准。EBCDIC码是由国际商用机器公司(IBM)为大型机操作系统而开发设计的,于1964年推出。
在 EBCDIC 码中,英文字母不是连续排列的,中间出现多次断续,这带来了一些困扰和麻烦。
因此,在后来 IBM 的个人计算机和工作站操作系统中并没有采用 EBCDIC 码,而是采用了晚于 EBCDIC 码推出、且后来成为了英文字符编码工业标准的 ASCII 编码方案。
作为开发人员,大家一定记得:
'A'' ~ 'Z' : 65 ~90
'a' ~ 'z' : 97 ~ 122
'0' ~ '9' : 48 ~ 57
2.
ASCII 码 (American Standard Code for Information Interchange 美国信息交换标准码),由美国国家标准学会 ANSI(American National Standard Institute) 于1968年正式制定。
之后,又于1972 年被 ISO/IEC 采用,制定为 ISO/IEC 646 标准 (ISO,即国际标准化组织International Standardization Organization,成立于1946 年;IEC,即国际电工技术委员会International Electrotechnical Commission,成立于1906年;ISO/IEC往往用来表示由这两大国际组织联合制定的标准)。
由于 ASCII 码要晚于EBCDIC码出现(网上也有文章说是 ASCII 码要早于 EBCDIC 码开始设计,但1968年 ASCII 码才正式确定为标准),ASCII 码的编码方式参照了 EBCDIC 码,并吸取了其经验教训,将英文字母进行了连续排列,这方便了程序处理。
3.
ASCII编码方案虽然不是最早出现的字符编码方案,但却是最基础、最重要、应用最广泛的字符编码方案。
目前所通行的其他字符编码方案,比如 ISO-8859、GB 系列 (GB2312、GBK、GB18030、GB13000)、Big5、Unicode 等等,均直接或间接兼容 ASCII 码。
而像 EBCDIC 这样与 ASCII 完全不兼容的编码方案,基本上处于已淘汰或将要淘汰的境地。
三、ASCII 字符编码方案介绍
1.
ASCII 码使用七个二进制数字 (bit比特、位) 来表示一个字符,总共表示128个字符(2^7 = 128,二进制编码为0000 0000 ~ 0111 1111,对应的十进制就是0~127)。
由于个人计算机普遍采用 8 位一个字节来进行存取与处理,因此剩下最高位的那1比特一般为0,但有时也被用作一些通讯系统的奇偶校验位。
2.
ASCII字符集共计有128个字符(见上表),码点编号(即字符编号)从0到127(二进制为从0000 0000到0111 1111,十六进制为从0x00到0x7F),二进制最高位都是0。其中:
0~31:控制字符或通讯专用字符(不可显示不可打印字符),如0x07(BEL响铃)会让计算机发出哔的一声、0x00(NUL空,注意不是空格)通常用于指示字符串的结束、0x0D(CR回车)和0x0A(LF换行)用于指示打印机的打印针头退到行首(即回车)并移到下一行(即换行)等。
32~126:可显示可打印字符(其中32为可显示但不可打印的空格字符),48~57为0-9的阿拉伯数字,65~90为26个大写英文字母,97~122为26个小写英文字母,其余的是一些标点符号、运算符号等。
127:控制字符 DEL。
3.
这时候的字符编解码非常简单,比如若要将字符序列编码为二进制流写入存储设备,只需要将该字符序列里的各个字符在 ASCII 字符集中的字符编号(即码点编号),直接以一个二进制字节写入存储设备即可,字符编号就是字符编码,中间不需要经过特别的编码算法进行字符编号到字符编码的转换计算,更不存在所谓码元序列到字节序列的转换。