### 编码
为什么要加上20H和80H?
1.
区位码,国际码,内码的转换虽然简单,但为什么要这样换呢?
首先,GB2312虽然是对中文编码,但是里面也有对26个英文字母和一些特殊符号的编码,按理说这些和ASCII重合的字符无需再次进行编码,直接沿用ASCII编码即可
2.
原来,当时在制定GB2312时候,决定对ASCII中的可打印字符,也就是英文字母,数字,和符号部分(33~126,127为不可打印的DEL)重新编入GB2312中,以两个字节表示,称之为全角字符(全角字符在屏幕上的宽度是ASCII字符的两倍,后来也因此称ASCII字符为半角字符)
而对于ASCII中前32个不可显示也不可打印的控制字符(ASCII码为0~31),以及第33个可显示但是不可打印的空格字符(ASCII码为32)等共33个不可打印字符的编码则直接沿用,不再重新编码。
3.
因为要保留这33个不可打印字符,就不能直接采用区位码作为计算机直接处理的机内码,需要将区位码向后移动32以避开冲突(为什么是移开32而不是移开33呢,是因为区位码的区码好位码都是是从1开始计数的,不像ASCII码还是从0开始计数的)。
十进制数字32的十六进制表示就是20(为区别十进制,记作20H),也就是区位码加上20H的(区码和位码各自加上20H)才能得到国标码的原因。
4.
很显然,如果直接采用国标码作为作为计算机直接处理的机内码的话,还会将产生一个弊端,即用ASCII码编码的英文字符无法GB2312的编码环境中直接打开,一打开就会乱码。
因为国标码虽然避开了ASCII码中0~32的前33个不可打印的字符,但没有避开ASCII码中的英文字母,数字和符号等可打印字符(33~126,共94个字符)以及不可打印的DEL(127)。
也就是说,国标码并不是完全兼容ASCII码的。
5,
为了解决这个弊端,考虑到ASCII码只用了一个字节中的低7位,最高位(即首位)为0,于是决定将国标码每个字节的最高位设为1(国标码的两个字节中的最高位都恒为0,即国标码中的每个字节实际上也只用了一个字节中的低7位),这就是GB2312的机内码(即内码),简称GB2312码。
这样一来就彻底区分开了ASCII码和GB2312码。这也是为什么国标码还要加上(80H,80H)才能得到机内码的原因。
6.
看到这里,有人或许又要问了:如果仅仅是为了避免与ASCII码相冲突,为什么最初不直接将区位码的区码和位码的最高位从0改为1(相当于各自直接加上128),这样不就无需经过国标码多此一举的中间转换了吗?而且还无需后移32,也就不用浪费这部分编码空间。
对此本人也很困惑,在网上搜了很久也没找到答案,因此具体原因。
相关资源:
https://www.bilibili.com/video/av67326533?from=search&seid=10435295054390730624
https://zhuanlan.zhihu.com/p/27120673