计算机信息技术继续传播,到了亚洲,遇到了汉字这个大坎。
GBK的产生:汉字的输入
首先,汉字和英语有很大的不同,英语可以直接通过键盘敲出来,键盘上敲个a就是a,敲b就是b,就算不是正确的单词,至少是一串字。汉语必须正确拼音才可以,并且一个音有多个音调,一个音调有多个汉字,一个汉字还有简体繁体区分,后来还有火星文,表情符号了解一下?需要借助一种叫做输入法的软件,来对键盘输入进行转换-选择-确认,才能输入进计算机系统。扯远了。。。
GB2312--有明显缺陷的算法
不管怎么输入,必须也得让系统能认出来,汉语那么多8位2进制肯定是表示不了的,那么需要多少位呢,也不知道他们是怎么统计出来的,决定再给8位,也就是16位2进制来表示汉字,这个编码叫做GB2312,这个GB好像是中文拼音“国标”的缩写,不知道哪个人才造出来的。
为了要和标准ASCII兼容,保持低7位不变。也就是假设某个数小于127,就认为是ASCII编码。那么如何区分是两字节的汉字,还是一字节的ASCII字符呢。一开始的想法比较low,是把低127位全部刨掉,读取的时候一旦检测到小于127,就认为是ASCII;一旦大于127就认为是汉字,就再取一位来一起取值。这样满打满算应该是128*128个容量,也就是16384个码位(Code Point)。但是事实上GB2312的编码并不是连续的。通过分区来区分组织,具体为什么通过分区来组织,原因也不详,可能就是为了分类吧。
然后我也不清楚具体GB2312是怎么编码的,汉字这种字,经常会有新的字被造出来,每个分区可能还要预留空间,最终实际GB2312空了很多空间,只包含了6763个汉字。。。
GBK--GB2312的修复版
其实可以看出,上面的兼容ASCII的做法有很大的问题。假设从前往后按字读取,为了保证第一时间知道是ASCII字符还是汉字,大于127的判断条件必须放在前一个字节上(请确保看懂这句话)。在前面一个大于127的基础上,第二个字节的数量完全可以取0-255的数字。也就是其实有127*256=32768个空间。这就是GBK编码,看到这里感觉制定GB2312的人逻辑思维很一般啊,是时代局限性的锅吗。。。
由于第一位一定要以1开头,所以第一个字节的范围是80-FF,不知道为什me不包括80个FF,实际的GBK第一个字节从81-FE,第二位也不是常规路线,有的从40开始,有的从A0开始,为什么要这么分是在是不清楚啊。总之,一共有23940个码位。
GBK这玩意好像一开始是方正搞的,后来被国家收编,感觉查不到很具体的细节,不知道什么鬼。
gb1803--32位的中文编码。。
支持简体中文、繁体中文 藏文、蒙文、维吾尔文等主要的少数民族文字
不说了,32位还有什么放不下呢。