Skip to main content

GBK

⚠️ 你先别急 ⚠️ 🚧 本页面仍在施工中 🚧

ASCII 或许在拓展之后还能够编码欧洲的语言,但是对于东亚的一些语言来说可能就力不从心了。我们需要更大的字符集,而更大的字符集就意味着在编码的时候势必不能仅仅使用一个字节了。本文以汉字为例,介绍最经典的汉字字符集和编码。

GB 2313

GB 2312 字符集兼容 ISO 2022,但现在一般用 EUC 编码。这两种编码方式会在后文介绍,我们先来看看字符集的设计。

GBK

GB 2312 有一些缺点,例如

于是有了 GBK,它甚至不是一个正式标准,响亮的名号却传遍了千家万户。

ISO 2022

ISO 2022 提出了一种多字节的编码方式。

ISO 2022 利用控制字符 ESC 和后续的若干个字符来表示接下来采用什么字符编码,字符编码的种类需要向 ISO 2022 申请。

例如:

  • ESC ( B 表示接下来开始 ASCII 字符集、编码

  • ESC $ ) A 表示接下来开始 GB 2312 字符集、编码

显然控制字符 ESC 必须在这样的字节序列中有特殊的地位,无论在什么字符集编码的时候读到它都不应该被认为是字符而应该是转义符,不过它 ISO 2022 给予了所有 C0 控制字符特殊地位。除去空格和 DEL,ASCII 定义了 94 个可打印字符。于是 ISO 2022 于是规定:对于可打印字符,单字节编码编码 9494 个可打印字符,双字节编码编码 94×94=94294\times 94=94^2 个可打印字符,以此类推(但是向 ISO 2022 申请的编码里只有单字节和双字节的)。可打印字符的每个字节都从 0x21 开始编码到 0×7E 结束,这样刚好就回避了注定只占一个字节的 C0 控制字符。

例:“万”字(区位码 45-82)的 ISO 2022 码十进制为:45+32, 82+32 = 77, 114,十六进制为:0x4D 0x72

虽然可以任意指定多个编码,但是这种方式似乎不太优雅,尤其是在我们只需要 ASCII 和另一种多字节编码的时候。于是我们有了 EUC。

EUC

EUC(Extended Unix Code,扩展 Unix 编码)提供了另一种编码方式。

既然 ASCII 都小于 0x80,那么大于等于 0x80 的字节就可以自由发挥。于是把 ISO 2022 中的多字节编码得每个字节都加上 128,就可以区分单字节的 ASCII 和多字节的其它编码了。

例:“万”字(区位码 45-82)的 EUC 码十进制为:45+32+128, 82+32+128 = 205, 242,十六进制为:0xCD 0xF2

这种编码方式兼容了 ASCII,且更易于识别,因此更受欢迎。

番外:其它东亚字符集

参考资料