|
1.94x94的故事
开门见山,gb2312编码实质上是一种对{汉字集合}排序管理的方法。汉字集合很好理解,不废话了。为什么要对汉字排序管理呢?这个问题好比新华字典里的汉字为什么按a/b/c/../z的顺序排列呢,答案就是为了使用方便。
经google得知,gb2312编码在大约30年前的1981年就制定出来了。当时计算机可想相当精贵,但现在从gb2312编码上看,当时这批制定者应该有一定的IT经验。他们聪明地构造了一个94x94的二维表,将当时需要处理的汉字散布在这8836个表格子里。不要问我为什么是94x94的二维表?他们可能觉得这个数量值应该能存放不少汉字了吧,我想这个答案只有他们最清楚。
为什么说他们聪明呢?因为他们不是将汉字胡乱、毫无规律地放进这些表格子里。所以你可能会立即想到他们可能按照拼音将汉字依次放进这些格子,的确,他们这么做了。gb2312里有一大部分汉字的排序方式就是按拼音规律 存放在这些格子里,还有一小部分留着各位看客自己研究吧,顺便提一下,要是研究出来个所以然,在下请麻烦您在本文下面回复一句,提点下我。
废话了半天,为的只是一个目的,就是,现在假设制定gb2312编码的制定者们把{汉字集合}里的汉字都放进这94x94的格子里了。到这里,不要有疑问,只要知道这回事就行了,因为你的疑问也改变不了gb2312的编码方式了。除非借个越光宝盒,回到30年前,改变制定者们的策略。可我想,即使真有月光宝盒,估计回去还没有成为受精卵,所以仍然无法改变事实。所以,就接受这个事实吧。汉字就这么地被安排在格子里啦。
下面使用中国的三个著名城市重庆、上海、香港梯度地说明计算机如何理解gb2312编码的过程。这里要严格区分一件事,虽然20世纪80年代的制定者将汉字已经排好序了并且已经让每个汉字都有个序号,但是在现今计算机里,这些序号表示不了对应的汉字,这些序号必须经过一定的算法才能成为各自汉字的代名词。
2.汉字的gb2312编码---重庆---区位码---算法1
汉字被放进这些格子里了,这些制定者为什么要这么做?好吧,先想想拼音,比如 '中' 这个字,它的 (拼音+声调) 小学就学过啦,想想就知道了。可是反过来 (拼音+声调) 能确定我说的是这个 '中' 字吗?当然不能,所以这里充其量有个充分但不必要的关系。那么这些制定者就想得比常人多了,他们通过这些格子的 (行号+列号) 与 汉字 做了个一一对应的充分必要关系。比如 '中' 字位于 (54行,48列),那么5448就表示这个 '中' 字。这里插个行话,上面提到的行号专业名词为 区号,列号称为 位号,所以gb2312编码有 94个区,94个位。5448就是 '中' 字在gb2312编码里的区位码。这里,可以通过以下链接得到gb2312编码里所有汉字的区位码:这里
区位号就是汉字编码吗?暂时还不是,对计算机来说,计算机为了处理方便,区号和行号分别用一个字节来表示。所以 '中' 字暂时在计算机里表现为
0 0 1 1 0 1 1 0 0 0 1 1 0 0 0 0
3. 汉字的gb2312编码---上海---交换码---算法2
老早以前就听说闭门造车不好,的确,近代中国的耻辱就是因为统治者的不思进取、闭关守国造成的。幸好gb2312编码的制定者在设计时有清晰的头脑,虽然没和国际社会做商量,但是国际社会还给予了充分的兼容性。区位码无法用于汉字通信,因为它可能与通信使用的控制码(00H~1FH)(即0~31)发生冲突。国际社会(ISO2022)规定每个汉字的区号和位号必须分别加上32(即二进制数00100000),经过这样的处理而得的代码称为国标交换码,简称交换码,因此, '中' 字的国标交换码计算为:
0 0 1 1 0 1 1 0 0 0 1 1 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0
-----------------------------------------
0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0
计算机暂时用为 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 是 '中' 这个汉字。
4. 汉字的gb2312编码 ---香港---机内码---算法3
但由于文本中通常混合使用汉字和西文字符,汉字信息如果不予以特别标识,就会与单字节的ASCII码混淆。此问题的解决方法之一是将一个汉字看成是两个扩展 ASCII码,使表示GB2312汉字的两个字节的最高位都为1。这种高位为1的双字节汉字编码即为GB2312汉字的机内码,简称为内码。所以按照前述说法,'中'字的机内码为将交换码两字节的高位分别置1,现在 '中' 的编码为:
1 1 0 1 0 1 1 0 1 1 0 1 0 0 0 0
这个编码就是 '中' 字在内存中实际使用的值,16进制表示为D6D0。
5.请记住---机内码才是汉字在gb2312编码方式下其在内存中的值 |