GBK 与GB2312 互查 区位码

(3) 2024-04-28 19:23

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进制,整理如下:

GBK 与GB2312 互查 区位码_https://bianchenghao6.com/blog__第1张
要查 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 苞 胞 包 褒 剥

GBK 与GB2312 互查 区位码_https://bianchenghao6.com/blog__第2张
“爸”位于 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~8710进制表示)
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区的 汉字举例,

GBK 与GB2312 互查 区位码_https://bianchenghao6.com/blog__第2张
“爸”位于 16 区,位号是 54,查低位(位号)“十进制对应十六进制表”,可得,
GBK 与GB2312 互查 区位码_https://bianchenghao6.com/blog__第4张
所以,“爸”字的 低位(位号)是: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 与GB2312 互查 区位码_https://bianchenghao6.com/blog__第5张
没错,能查到,巧了,GBK中”爸“字的编码也是 B0D6,这说明,GB2312 包含在 GBK 中。

GBK 与GB2312 互查 区位码_https://bianchenghao6.com/blog__第6张
应该是这么个关系,
资料中也显示:GBK编码,是对GB2312编码的扩展,收录了GB 2312中的6763 个汉字,按原顺序排列。
这就是说,我们按 GB2312 的十进制编码表 查询到 汉字的 10进制区位号后,先转成 16进制数,然后再给区号和位号分别都加上 A0 后,得到的最终16进制形式的 区位号,就按这个号去 GBK 里查询,能查到同一个字,

February the 25th 2022 Friday

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复