ASCII
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其西欧语言。
码表如下:
观察表可得出:
- 0-31和127是控制字符或通信专用字符,例如6号字符ACK用于计算就网络的通信
- 48-57号字符标识阿拉伯数字0-9,48-57即8为二进制数
0011 0000
-0011 1001
,即后四位可看作0-9的8421
码 - 65-90号字符为大写字母A-Z,8位二进制数
0100 0001
-01011010
,前三位均为010
,后五位为1-26的二进制数 - 97-122号字符为小写字母a-z,8位二进制数
0110 0001
-0111 1010
,前三位均为011
,后五位为1-26的二进制数
由此规律,若告诉大写X
的二进制码为0101 1000
,则直接得出小写x
的二进制码为0111 1000
GB2312-80
为使中国汉字也可在计算机上表示出来,1980年国家标准局发布了GB2312-80
编码
区位码
基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,成为区位码。
01-09区收录除汉字外的682个字符
10-15区为空白区,没有使用
16-55区收录3755个一级汉字,按拼音排序
56-87区收录3008个二级汉字。按部首/笔画排序
88-94区为空白区,没有使用
可通过区位码查询自己了解一下
例如:
可得我
的区位码为4650
国标码
在区位码设计时,为将ASCII码中英文数字之类包含在内,将非中文字符放在了01-09区,可问题是还有32个控制通信字符没有考虑在内
因此,将区码和位码均偏移32位,即都加上20H
那为什么区码和位码都要加20H呢,因为英文采用ASCII码,0-127个字符,即2的7次方个字符,占了7位,最高位补0,满8位位一个字节。例如我向朋友发送字符A,在机器码中则表示为0100 0001
。而区位码的存在,使得表示中国汉字需要两个字节,因此,每个字节都要加上20H,给32个特殊字符让出位置
因此我
的区位码4650(2E32)转化为国标码为4E52(2E+20 32+20)
机内码
在前面提到过,A占一个字节,8位二进制数为0100 0001
,最高位0是一个标识,表示这是一个ASCII码
而国内码转化为二进制流后,为避免与ASCII码发生冲突,则将最高位定位1,这样1100 0001
就代表着一个GB2312编码,计算机就不是将其判定为ASCII码
因此在国标码的基础上,区码和位码均加上1000 0000
即80H
因此我
的机内码为CED2(4E+80 52+80)
可用Python验证一下:
与我们计算的完全一致!
GBK和UTF-8
随着互联网发展,GB2312编码不能够满足中国字符的表达(中国汉字有上万个),因此在GB2312的基础上,做出了扩展,这里不做深究了。
世界上国家太多了,一个国家一套编码不太现实。这个世界从来都是有需求就有供应。这时候,为拯救你的硬盘和流量,ISO(International Organization for Standardization)国际标准组织就站出来要融合世界所有字符,经过长期的发展,形成了UTF-8编码
UTF-8编码盛行的当下,gb2312和gbk编码亦有着广泛的使用…