东亚非拼写文字的编码面临的共同问题是字符数量非常大。
GB2312
全称是GB2312-1980,中国大陆第一个汉字编码标准。采用两个字节表示一个汉字或者符号,涵盖了绝大多数的常用汉字6千余。
因为确定要收录的字符数量比较多,所以对其进行了分区,总共分了94个分区(从1区开始),每个分区有94个位。10-15区和88-94区空闲。
汉字的范围在16区~87区。
区位码
区位码是GB2312规范中的编码字符集。
GB2312的区代码范围是:[1,9]和[16,88],位代码范围是:[1,94]。
举例说明:汉字“啊”在第16码区第1位,所以它的区位码应该是:1601
国标码
国标码是GB2312规范中的字符编码表。
区域码的两个字节码位,统一都向后偏移32个码位,就能兼容ASCII码(就是能使用ASCII前32个码位的控制符号了),这就是国标码。所以国标码就是一个GB232字符的区码和位码分别加上32(十六进制是0x20)再组合在一块。GB2312规范只规定了国标码,也就是只规定到了编码阶段。
国标码可以用来传递信息了,但是如果把国标码存储到文件中,是无法和ASCII码区分的。
我们来说一下为什么二者的字节内容无法区分。
前面说了区位码存在94个区,每个区有94个位,转为国标码后,两个字节各自对应的数字都小于128,所以和ASCII没办法区分。
机器码
因为国标码无法存储到文件中,所以出现了机器码。
为了在文件中区分GB2312字符的字节,统一把国际码的两个字节高位标记为1,实际效果就是加了128(十六进制是0x80)。
由此可知,区位码的区字节和位字节分别加上160(32+128,十六进制的0xA0)得到的2字节序列就是机器码。
GB2312机器码码位
码位起 | 码位止 | 内容 | 说明 | |
---|---|---|---|---|
高位 | 0xA1(0b1010 0001) | 0xF7(0b1111 0111) | 所在区代码 | 0xA0加上1~87 |
低位 | 0xA1(0b1010 0001) | 0xFE(0b1111 1110) | 所在位代码 | 0xA0加上1~94 |
GB2312机器码中汉字码位
码位起 | 码位止 | 内容 | 说明 | |
---|---|---|---|---|
高位 | 0xB0(0b1011 0000) | 0xF7(0b1111 0111) | 所在区代码 | 0xA0加上16~87 |
低位 | 0xA1(0b1010 0001) | 0xFE(0b1111 1110) | 所在位代码 | 0xA0加上1~94 |
PS:其中有5个空位是D7FA-D7FE,55区90~94位。
特点
- 码位不连续
- 双字节
- 字节最高位都为1
GBK
GBK兼容扩展了GB2312,这是一个过渡标准,非国家标准。
GBK扩充了字符表,收录了2万余字符,为了多存储字符,打破了双字节最高位都是1的限制。
特点
- 双字节
- 首字节最高位为1,末字节无此限制
- 兼容GB2312
GB18030
采用变长编码,存在单字节、2字节、4字节三种方式对字符进行编码,码位更加复杂。兼容GB2312,基本兼容GBK,支持Unicode相关所有码位,公收录汉字7万余。
可以理解为Unicode的变种。
疑问
- GB2312国标码存在的意义是什么?
- GB18030和Unicode的具体关系如何?
- 国家标准要求强制执行,如何体现?