GB2312 编码的补码为何是 0xA0?

这玩意的故事就很好玩了

ECMA 在 1974 年搞了个规范叫 ECMA-35,这是个 7 位的编码框架。它的编码空间可以定义 2 组 32 字的控制块(Control Block)以及 4 组图形块。每个图形块中可以包含 94(或 96——算空格和 DEL 的话)。70 年代后期的一批 94×94 的码表(JIS-X-0208、GB-2312……)就是这么给搞出来的:把一个图形块定义成两个字节表示一个字就行了。ECMA-35 的 7 位表示中,当前字节表示哪个图形块是使用转义序列切换的。

而 ECMA-35 同时也定义了 8 位的编码方案,在 8 位的方案中:

  1. 0x00 - 0x1f 分配给 C0 控制块
  2. 0x20 - 0x7f 分配给 G0 图形块(包括空格和 DEL)
  3. 0x80 - 0x9f 分配给 C1 控制块
  4. 0xa0 - 0xff 分配给 G1、G2 和 G3 图形块,用转义序列切换

然后我不是说 GB-2312 的码表是 94×94 的么?没错,这个 94×94 的码表刚好可以放在一个图形块 G1 里(双字节),而 G0 则和 ASCII 一致。8 位字节的话连转义序列都省了。

这就是 0xA0 的来历。

编辑于 2014-08-30 18:55

Published

Category

Zhihu

Tags