Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说GBK 与GB2312 互查 区位码,希望能够帮助你!!!。
这两天做了一个简单的,GBK 与GB2312 互查 区位码,方便有需要据GBK查GB2312,或者据GB2312查GBK的同学使用。
先把依据贴出来,
GB2312编码是第一个汉字编码国家标准,由中国国家标准总局1980年发布,1981年5月1日开始使用。
GB2312规定每个字符采用两个字节表示,第一个字节为“高字节”,对应94个区;第二个字节为“低字节”,对应94个位。
GB2312编码对所收录字符进行了“分区”处理,共94个区,每区含有94个位,共8836个码位。这种表示方式也称为区位码。
16 0 1 2 3 4 5 6 7 8 9
0 啊 阿 埃 挨 哎 唉 哀 皑 癌
1 蔼 矮 艾 碍 爱 隘 鞍 氨 安 俺
2 按 暗 岸 胺 案 肮 昂 盎 凹 敖
3 熬 翱 袄 傲 奥 懊 澳 芭 捌 扒
4 叭 吧 笆 八 疤 巴 拔 跋 靶 把
5 耙 坝 霸 罢 爸 白 柏 百 摆 佰
6 败 拜 稗 斑 班 搬 扳 般 颁 板
7 版 扮 拌 伴 瓣 半 办 绊 邦 帮
8 梆 榜 膀 绑 棒 磅 蚌 镑 傍 谤
9 苞 胞 包 褒 剥
举例来说,“啊”字,它位于16区的01位,所以它的区位码就是1601。
“艾”字,也位于16区,它的位码是12,所以它的区位码就是 1612.
再举个例子,
16区的,80位是 梆,81位是 榜,82位是 膀,83位是 绑,84位是 棒,85位是 磅,86位是 蚌,87位是 镑,88位是 傍,89位是 谤
汉字的位号是先行后列,
请注意,这里给大家粘出来的 GB2312 字符集的区位号是10进制的
,
所以要和区位码是 16 进制的 GBK 互查,就需要将 10 进制先转换成 16 进制,
转换规则是,将 10 进制 先转换成 16 进制,然后,再加上 0xA0,就成了 16 进制的 GB2312 编码。
高位码(从16区开始到87区结束)10进制对应16进制,整理如下:
要查 GB2312 编码的高字节(也就是区号),可以使用这个表,
“10进制对应16进制表
”
十进 二进 十六进 十六进加 A0 十进 二进 十六进 十六进加 A0
16 0001 0000 1 0 B 0 53 0011 0101 3 5 D 5
17 0001 0001 1 1 B 1 54 0011 0110 3 6 D 6
18 0001 0010 1 2 B 2 55 0011 0111 3 7 D 7
19 0001 0011 1 3 B 3 56 0011 1000 3 8 D 8
20 0001 0100 1 4 B 4 57 0011 1001 3 9 D 9
21 0001 0101 1 5 B 5 58 0011 1010 3 A D 10
22 0001 0110 1 6 B 6 59 0011 1011 3 B D 11
23 0001 0111 1 7 B 7 60 0011 1100 3 C D 12
24 0001 1000 1 8 B 8 61 0011 1101 3 D D 13
25 0001 1001 1 9 B 9 62 0011 1110 3 E D 14
26 0001 1010 1 A B 10 63 0011 1111 3 F D 15
27 0001 1011 1 B B 11 64 0100 0000 4 0 E 0
28 0001 1100 1 C B 12 65 0100 0001 4 1 E 1
29 0001 1101 1 D B 13 66 0100 0010 4 2 E 2
30 0001 1110 1 E B 14 67 0100 0011 4 3 E 3
31 0001 1111 1 F B 15 68 0100 0100 4 4 E 4
32 0010 0000 2 0 C 0 69 0100 0101 4 5 E 5
33 0010 0001 2 1 C 1 70 0100 0110 4 6 E 6
34 0010 0010 2 2 C 2 71 0100 0111 4 7 E 7
35 0010 0011 2 3 C 3 72 0100 1000 4 8 E 8
36 0010 0100 2 4 C 4 73 0100 1001 4 9 E 9
37 0010 0101 2 5 C 5 74 0100 1010 4 A E 10
38 0010 0110 2 6 C 6 75 0100 1011 4 B E 11
39 0010 0111 2 7 C 7 76 0100 1100 4 C E 12
40 0010 1000 2 8 C 8 77 0100 1101 4 D E 13
41 0010 1001 2 9 C 9 78 0100 1110 4 E E 14
42 0010 1010 2 A C 10 79 0100 1111 4 F E 15
43 0010 1011 2 B C 11 80 0101 0000 5 0 F 0
44 0010 1100 2 C C 12 81 0101 0001 5 1 F 1
45 0010 1101 2 D C 13 82 0101 0010 5 2 F 2
46 0010 1110 2 E C 14 83 0101 0011 5 3 F 3
47 0010 1111 2 F C 15 84 0101 0100 5 4 F 4
48 0011 0000 3 0 D 0 85 0101 0101 5 5 F 5
49 0011 0001 3 1 D 1 86 0101 0110 5 6 F 6
50 0011 0010 3 2 D 2 87 0101 0111 5 7 F 7
51 0011 0011 3 3 D 3 88 0101 1000 5 8 F 8 未使用
52 0011 0100 3 4 D 4 89 0101 1001 5 9 F 9 未使用
还拿16区的 汉字举例,
16 0 1 2 3 4 5 6 7 8 9
0 啊 阿 埃 挨 哎 唉 哀 皑 癌
1 蔼 矮 艾 碍 爱 隘 鞍 氨 安 俺
2 按 暗 岸 胺 案 肮 昂 盎 凹 敖
3 熬 翱 袄 傲 奥 懊 澳 芭 捌 扒
4 叭 吧 笆 八 疤 巴 拔 跋 靶 把
5 耙 坝 霸 罢 爸 白 柏 百 摆 佰
6 败 拜 稗 斑 班 搬 扳 般 颁 板
7 版 扮 拌 伴 瓣 半 办 绊 邦 帮
8 梆 榜 膀 绑 棒 磅 蚌 镑 傍 谤
9 苞 胞 包 褒 剥
“爸”位于 16 区,区号是 16,
使用上面提供的 高位码(区号)的“10进制对应16进制表”,可查到,
十进 二进 十六进
16 0001 0000 1 0
区号16号:
十进制 值是: 16 ,其,二进制 值 是:0001 0000 ,十六进制 值是:1 0 ,
再根据GB2312 编码的规则,再加上一个 A0,有
十六进制的 10 加上 十六进制的 A0
1 0
+ A 0
------
B 0
所以,
区号 16
的 GB2312 编号是 B 0
所以 “爸” 字的 区号 十六进制值是: B 0
再查表可得
区号 87
的 GB2312 编号是 F 7
因此,GB2312 编码中,汉字的区号的范围是
16~87(10进制表示)
B0~F7(16进制表示)
16~87(10进制表示)中,每个区里的位号是相同的,都是从 00~99
(十进制表示)
十进制和十六进制对应表,,整理如下,
“数字1~96十进制对应十六进制表
”
1 0000 0001 0 1 17 0001 0001 1 1 33 0010 0001 2 1 49 0011 0001 3 1 65 0100 0001 4 1 81 0101 0001 5 1
2 0000 0010 0 2 18 0001 0010 1 2 34 0010 0010 2 2 50 0011 0010 3 2 66 0100 0010 4 2 82 0101 0010 5 2
3 0000 0011 0 3 19 0001 0011 1 3 35 0010 0011 2 3 51 0011 0011 3 3 67 0100 0011 4 3 83 0101 0011 5 3
4 0000 0100 0 4 20 0001 0100 1 4 36 0010 0100 2 4 52 0011 0100 3 4 68 0100 0100 4 4 84 0101 0100 5 4
5 0000 0101 0 5 21 0001 0101 1 5 37 0010 0101 2 5 53 0011 0101 3 5 69 0100 0101 4 5 85 0101 0101 5 5
6 0000 0110 0 6 22 0001 0110 1 6 38 0010 0110 2 6 54 0011 0110 3 6 70 0100 0110 4 6 86 0101 0110 5 6
7 0000 0111 0 7 23 0001 0111 1 7 39 0010 0111 2 7 55 0011 0111 3 7 71 0100 0111 4 7 87 0101 0111 5 7
8 0000 1000 0 8 24 0001 1000 1 8 40 0010 1000 2 8 56 0011 1000 3 8 72 0100 1000 4 8 88 0101 1000 5 8
9 0000 1001 0 9 25 0001 1001 1 9 41 0010 1001 2 9 57 0011 1001 3 9 73 0100 1001 4 9 89 0101 1001 5 9
10 0000 1010 0 A 26 0001 1010 1 A 42 0010 1010 2 A 58 0011 1010 3 A 74 0100 1010 4 A 90 0101 1010 5 A
11 0000 1011 0 B 27 0001 1011 1 B 43 0010 1011 2 B 59 0011 1011 3 B 75 0100 1011 4 B 91 0101 1011 5 B
12 0000 1100 0 C 28 0001 1100 1 C 44 0010 1100 2 C 60 0011 1100 3 C 76 0100 1100 4 C 92 0101 1100 5 C
13 0000 1101 0 D 29 0001 1101 1 D 45 0010 1101 2 D 61 0011 1101 3 D 77 0100 1101 4 D 93 0101 1101 5 D
14 0000 1110 0 E 30 0001 1110 1 E 46 0010 1110 2 E 62 0011 1110 3 E 78 0100 1110 4 E 94 0101 1110 5 E
15 0000 1111 0 F 31 0001 1111 1 F 47 0010 1111 2 F 63 0011 1111 3 F 79 0100 1111 4 F 95 0101 1111 5 F
16 0001 0000 1 0 32 0010 0000 2 0 48 0011 0000 3 0 64 0100 0000 4 0 80 0101 0000 5 0 96 0110 0000 6 0
按GB2312 编码 规则,给所有的16进制的值都加上 A0 ,整理如下,
“GB2312 编码,低位(位号)“十进制对应十六进制表
”
1 0000 0001 A 1 17 0001 0001 B 1 33 0010 0001 C 1 49 0011 0001 D 1 65 0100 0001 E 1 81 0101 0001 F 1
2 0000 0010 A 2 18 0001 0010 B 2 34 0010 0010 C 2 50 0011 0010 D 2 66 0100 0010 E 2 82 0101 0010 F 2
3 0000 0011 A 3 19 0001 0011 B 3 35 0010 0011 C 3 51 0011 0011 D 3 67 0100 0011 E 3 83 0101 0011 F 3
4 0000 0100 A 4 20 0001 0100 B 4 36 0010 0100 C 4 52 0011 0100 D 4 68 0100 0100 E 4 84 0101 0100 F 4
5 0000 0101 A 5 21 0001 0101 B 5 37 0010 0101 C 5 53 0011 0101 D 5 69 0100 0101 E 5 85 0101 0101 F 5
6 0000 0110 A 6 22 0001 0110 B 6 38 0010 0110 C 6 54 0011 0110 D 6 70 0100 0110 E 6 86 0101 0110 F 6
7 0000 0111 A 7 23 0001 0111 B 7 39 0010 0111 C 7 55 0011 0111 D 7 71 0100 0111 E 7 87 0101 0111 F 7
8 0000 1000 A 8 24 0001 1000 B 8 40 0010 1000 C 8 56 0011 1000 D 8 72 0100 1000 E 8 88 0101 1000 F 8
9 0000 1001 A 9 25 0001 1001 B 9 41 0010 1001 C 9 57 0011 1001 D 9 73 0100 1001 E 9 89 0101 1001 F 9
10 0000 1010 A A 26 0001 1010 B A 42 0010 1010 C A 58 0011 1010 D A 74 0100 1010 E A 90 0101 1010 F A
11 0000 1011 A B 27 0001 1011 B B 43 0010 1011 C B 59 0011 1011 D B 75 0100 1011 E B 91 0101 1011 F B
12 0000 1100 A C 28 0001 1100 B C 44 0010 1100 C C 60 0011 1100 D C 76 0100 1100 E C 92 0101 1100 F C
13 0000 1101 A D 29 0001 1101 B D 45 0010 1101 C D 61 0011 1101 D D 77 0100 1101 E D 93 0101 1101 F D
14 0000 1110 A E 30 0001 1110 B E 46 0010 1110 C E 62 0011 1110 D E 78 0100 1110 E E 94 0101 1110 F E
15 0000 1111 A F 31 0001 1111 B F 47 0010 1111 C F 63 0011 1111 D F 79 0100 1111 E F 95 0101 1111 F F
16 0001 0000 B 0 32 0010 0000 C 0 48 0011 0000 D 0 64 0100 0000 E 0 80 0101 0000 F 0 96 0110 0000 溢出
还拿16区的 汉字举例,
“爸”位于 16 区,位号是 54,查低位(位号)“十进制对应十六进制表”,可得,
所以,“爸”字的 低位(位号)是:D 6
加上之前我们查到的 “爸” 字的 区号(高位) 十六进制值是: B 0
得到,“爸”字的GB2312 编码为: B 0 D 6
拿这个值,我们去GBK里查,看看能不能查到”爸“这个字,
GBK
B0 0 1 2 3 4 5 6 7 8 9 A B C D E F
4 癅 癆 癇 癈 癉 癊 癋 癎 癏 癐 癑 癒 癓 癕 癗 癘
5 癙 癚 癛 癝 癟 癠 癡 癢 癤 癥 癦 癧 癨 癩 癪 癬
6 癭 癮 癰 癱 癲 癳 癴 癵 癶 癷 癹 発 發 癿 皀 皁
7 皃 皅 皉 皊 皌 皍 皏 皐 皒 皔 皕 皗 皘 皚 皛
8 皜 皝 皞 皟 皠 皡 皢 皣 皥 皦 皧 皨 皩 皪 皫 皬
9 皭 皯 皰 皳 皵 皶 皷 皸 皹 皺 皻 皼 皽 皾 盀 盁
A 盃 啊 阿 埃 挨 哎 唉 哀 皑 癌 蔼 矮 艾 碍 爱 隘
B 鞍 氨 安 俺 按 暗 岸 胺 案 肮 昂 盎 凹 敖 熬 翱
C 袄 傲 奥 懊 澳 芭 捌 扒 叭 吧 笆 八 疤 巴 拔 跋
D 靶 把 耙 坝 霸 罢 爸 白 柏 百 摆 佰 败 拜 稗 斑
E 班 搬 扳 般 颁 板 版 扮 拌 伴 瓣 半 办 绊 邦 帮
F 梆 榜 膀 绑 棒 磅 蚌 镑 傍 谤 苞 胞 包 褒 剥
没错,能查到,巧了,GBK中”爸“字的编码也是 B0D6,这说明,GB2312 包含在 GBK 中。
应该是这么个关系,
资料中也显示:GBK编码,是对GB2312编码的扩展,收录了GB 2312中的6763 个汉字,按原顺序排列。
这就是说,我们按 GB2312 的十进制编码表 查询到 汉字的 10进制区位号后,先转成 16进制数,然后再给区号和位号分别都加上 A0 后,得到的最终16进制形式的 区位号,就按这个号去 GBK 里查询,能查到同一个字,
February the 25th 2022 Friday
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章