0%

字符编码笔记(二)

东亚非拼写文字的编码面临的共同问题是字符数量非常大。

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的具体关系如何?
  • 国家标准要求强制执行,如何体现?