转自:https://blog.csdn.net/itplus/article/details/15341009
GB2312 是基于区位码设计的,在区位码的区号和位号上分别加上 A0H 就得到了 GB2312 编码。这里第一次提到了“区位码”,我就连带把下面这几个让人摸不到头脑的 XX 码一锅端了吧:
区位码,国标码,交换码,内码,外码
区位码:就是把中文常用的符号,数字,汉字等分门别类进行编码。区位码把编码表分为 94 个区,每个区对应 94 个位,每个位置就放一个字符(汉字,符号,数字都属于字符)。这样每个字符的区号和位号组合起来就成为该汉字的区位码。区位码一般用 10 进制数来表示,如 4907 就表示 49 区 7 位,对应的字符是“学”。区位码中 01-09 区是符号、数字区,16-87 区是汉字区,10-15 和 88-94 是未定义的空白区。它将收录的汉字分成两级:第一级是常用汉字计 3755 个,置于 16-55 区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计 3008 个,置于 56-87 区,按部首/笔画顺序排列。在网上搜索“区位码查询系统”可以很方便的找到汉字和对应区位码转换的工具。为了避免广告嫌疑和死链,这里就不举例了。
国标码: 区位码无法用于汉字通信,因为它可能与通信使用的控制码(00H~1FH)(即 0~31,还记得 ASCII 码特殊字符的范围吗?)发生冲突。于是 ISO2022 规定每个汉字的区号和位号必须分别加上 32(即二进制数 00100000,16 进制 20H),得到对应的国标交换码,简称国标码,交换码,因此,“学”字的国标交换码计算为:
1 2 3 4 |
+ 00100000 00100000 ------------------- 01010001 00100111 |
用十六进制数表示即为 5127H。
交换码:即国标交换码的简称,等同上面说的国标码。
内码:由于文本中通常混合使用汉字和西文字符,汉字信息如果不予以特别标识,就会与单字节的 ASCII 码混淆。此问题的解决方法之一是将一个汉字看成是两个扩展 ASCII码,使表示 GB2312 汉字的两个字节的最高位都为 1。即国标码加上 128(即二进制数 10000000,16 进制 80H)这种高位为 1 的双字节汉字编码即为 GB2312 汉字的机内码,简称为内码。20H + 80H = A0H。这也就是常说的在区位码的区号和位号上分别加上 A0H 就得到了 GB2312 编码的由来。
1 2 3 4 |
+ 10100000 10100000 ------------------- 11010001 10100111 |
用十六进制数表示即为 D1A7H。
外码:机外码的简称,就是汉字输入码,是为了通过键盘字符把汉字输入计算机而设计的一种编码。 英文输入时,相输入什么字符便按什么键,外码和内码一致。汉字输入时,可能要按几个键才能输入一个汉字。 汉字输入方案有成百上千个,但是这千差万别的外码输入进计算机后都会转换成统一的内码。
最后总结一下上面的概念。中国国家标准总局把中文常用字符编码为 94 个区,每个区对应 94 个位,每个字符的区号和位号组合起来就是该字符的区位码, 区位码用10进制数来表示,如 4907 就表示 49 区 7 位,对应的字符是“学”。 由于区位码的取值范围与通信使用的控制码(00H~1FH)(即 0~31)发生冲突。每个汉字的区号和位号分别加上32(即 16 进制 20H)得到国标码,交换码。“学”的国标码为 5127H。由于文本中通常混合使用汉字和西文字符,为了让汉字信息不会与单字节的 ASCII 码混淆,将一个汉字看成是两个扩展 ASCII 码,即汉字的两个字节的最高位置为 1,得到的编码为 GB2312 汉字的内码。“学”的内码为 D1A7H。无论你使用什么输入法,通过什么样的按键组合把“学”输入计算机,“学”在使用 GB2312(以及兼容 GB2312)编码的计算机里的内码都是 D1A7H。