上一篇《字符编码发展史2 — ISO-8859-N》我们讲解了ANSI编码中的ISO-8859-N。本篇我们将继续讲解字符编码的第二个发展阶段中的GB2312/Big5/GBK/GB18030。

2.2. 第二个阶段 本地化

2.2.3. 多字节编码

ISO 8859-N系列的编码都是单字节编码,可收录最多255个字符,这对欧洲地区的拉丁语系的语言来说,已经能够满足他们的编码需求了。但是对于亚洲地区以汉字为基础的语系,如:中国的汉语,以及日语、韩语、越南语,256个字符显然是不够的,单字节编码就无法完全表示了。于是就出现了很多由多个字节组成的多字节编码,如:GB2312、Big5、GBK、GB18030。

2.2.3.1. GB2312

1. 什么是GB2312?

GB2312是中国国家标准总局发布的一种用于中文信息交换的字符编码标准,全称为《信息交换用汉字编码字符集·基本集》。它于1981年5月1日实施,标准号为GB2312-1980,所以你看到的GB2312-1980GB2312-80GB2312指的都是同一个东西,只不过有多个不同的叫法。

GB2312中的“GB”为“国标”的汉语拼音首字母缩写,即“国家标准”之意,GB2312是早期在计算机中处理简体中文的重要标准,后被GBK和GB18030替代。

GB2312主要收录了简体中文字符,共收录6763个汉字,其中一级汉字3755个,二级汉字3008个。覆盖了中国大陆99.75%的使用频率。

为了与ASCII兼容,小于128的字符含义与ASCII相同,但两个大于128(0xA1-0xFE)的字符连在一起时,就表示一个汉字。

在这些编码里,还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的全角字符,而原来在127以下的那些就叫半角字符了。

2. GB2312的编码规则

GB2312只是编码表,用区码位来表示,分为94个区(01-94),每区94个字符(01-94),你可以理解为一个“94 * 94的二维矩阵”,矩阵里每一个单元代表一个字符。

GB2312在计算机中通常都是用"EUC-CN"表示法,在计算机编码时,区和位分别占用一个字节,前面一个字节(0xA1-0xFE)表示区位,称之为高字节;后面一个字节(0xA1-0xFE)表示码位,称之为低字节。为了与ASCII兼容(范围为0x00~0x7F),每个区和位对应的字节加上0xA0来表示,举例:“万”字在45区82位,45 + 0xA0 = 0x2D + 0xA0 = 0xCD,82 + 0xA0 = 0x52 + 0xA0 = 0xF2,所以“万”这个字在计算机编码后表示为0xCDF2。(注意十进制与十六进制的转换)

因此,GB2312在计算机里编码的范围就是:0xA1A1~0xFEFE。这里为什么是加上0xA0而不是0x80(这样的话就可以多出7168个编码空间),目前不得而知。

GB2312各个区段收集的字符类型如下:

  • 01-09区: 为特殊符号。
  • 10-15区: 没有编码,属于保留区段。
  • 16-55区: 为一级汉字,按拼音排序,共3755个。
  • 56-87区: 为二级汉字,按部首/笔画排序,共3008个。
  • 88-94区: 没有编码,属于保留区段。
3. GB2312的编码表

file
GB2312编码的开始部分

完整的编码表参见:GB2312 编码表

2.2.3.2. Big5

1. 什么是Big5?

Big5又称为大五码五大码,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13060个汉字,台湾地区繁体中文标准字符集,采用双字节编码,共收录 13053 个中文字,于 1984 年实施。

中国人都知道,由于历史原因,中国大陆和台湾虽然同属一个中国,但目前还是两个政府在执政(特别说明:这句话写于2024年9月)。中国大陆地区在1956年正式公布了《汉字简化方案》,此后通用汉字就采用了简体中文,而台湾地区依然保留使用传统的繁体中文。所以台湾地区要应用计算机就必须要解决繁体字的编码问题,而当时也没有繁体字的通用编码(GB2312只收录了简体中文汉字),所以他们就自己制定了一套繁体字的编码Big5,且与GB2312不兼容。

大五码(Big5)是由台湾财团法人信息产业策进会为五大中文套装软件所设计的中文共通内码,在1983年12月完成公告,于1984年实施。

2. Big5的编码规则

Big5是一套双字节字符集,以两个字节来安放一个字。第一个字节称为高位字节,使用了0x81-0xFE;第二个字节称为低位字节,使用了0x40-0x7E0xA1-0xFE

在Big5的的编码区分类:

  • 0x8140-0xA0FE: 保留给用户自定义字符(造字区)。
  • 0xA140-0xA3BF: 标点符号、希腊字母及特殊符号,包括在 0xA259-0xA261,安放了九个计量用汉字:兙兛兞兝兡兣嗧瓩糎。
  • 0xA3C0-0xA3FE: 保留。此区没有开放作造字区用。
  • 0xA440-0xC67E: 常用汉字,先按笔划再按部首排序。
  • 0xC6A1-0xC8FE: 保留给用户自定义字符(造字区)。
  • 0xC940-0xF9D5: 次常用汉字,亦是先按笔划再按部首排序。
  • 0xF9D6-0xFEFE: 保留给用户自定义字符(造字区)。
3. Big5的编码表

file
Big5编码的开始部分

完整的编码表参见:Big5 编码表

2.2.3.3. GB13000

特别说明:GB13000是历史发展过程中的中间产物,没有正式发布实施,也没有被业界采用。

(GB13000收录的字符,后面被编入到GBK中,之后又被GB18030继承。所以你大可不必关心这个编码,可以把它当做从来没有出现过。)

2.2.3.4. GBK

1. 什么是GBK?

GBK的全称《汉字内码扩展规范》,Chinese Internal Code Specification,K为汉语拼音 Kuo Zhan中Kuo字的声母。是对GB2312的拓展。

GBK最初是由微软对GB2312的扩展,也就是CP936(Code Page 936)的扩展(原来的CP936是对应GB 2312),最初出现于"Windows 95简体中文版"中。GBK本身并非国家标准,但由于Windows产品的流行和在大陆广泛被使用,后来中华人民共和国国家有关部门将其作为技术规范的指导性文件。

GB2312的扩展,在现在的windows系统中仍然使用代码页CP936表示,但是同样的的代码页跟一开始的的代码页只支持GB2312编码不同,现在的代码页支持同时也向下兼容GB2312。

相较于GB2312,GBK主要新增了中文繁体字和CJK字符。CJKChinese(中文), Japanese(日语), Korean(韩语)的首字符缩写,即以汉字为基础的语系中的中文、日语、韩语的字符集合。后面又扩展包含了越南语(Vietnam)的字符,即CJKV,中、日、韩、越字符集。

2. GBK的编码规则

GBK对GB2312未编码的空间(GB2312未充分利用两个字节的所有空间)再进行编码。共占23940个码位(码位区间0x8140~0xFE7E0x8180~0xFEFE),定义了21886个字符。包含了Big5编码中的所有汉字,但是与Big5编码不兼容。

与GB2312一样,GBK干是双字节编码。不同的是GBK只要求第一个字节(即高字节)大于127就固定表示这是一个汉字的开始,GBK的低字节可以小于127,即低字节的首位可以是0,也可以是1;而GB2312要求两个字节都必须大于127。

file
GBK和GB18030编码区间

GBK编码区的分类:

  • 汉字区

    • GBK/2: 0xB0A1~pxF7FE, 收录GB2312汉字6763个,按原序排列; 第一个字节为什么是0xB0~0xF7,我们从前面GB2312的编码规则知道,GB2312实际收录的一级、二级汉字是16-87区,0xA1 + 15 = 0xA1 + 0x0F = 0XB0,0xA1 + 86 = 0xA1 + 0x56 = 0XF7
    • GBK/3: 0x8140~pxA0FE, 收录 GB 13000.1 中的 CJK 汉字6080个。
    • GBK/4: 0xAA40~pxFEA0, 收录 CJK 汉字和增补的汉字 8160 个。
  • 图形符号区

    • GBK/1: 0xA1A1~0xA9FE, 收录GB2312已有的特殊符号,除GB2312的符号外,还增补了一些其它符号。
    • GBK/5: 0xA840~0xA9A0, GB 13000.1 扩充非汉字区。包括BIG-5 非汉字符号、结构符等,共计符号166个。
  • 用户自定义区

    • EUDC1: 0xAAA1-0xAFFE,码位 564 个。
    • EUDC2: 0xF8A1-0xFEFE,码位 658 个。
    • EUDC3: 0xA140-0xA7A0,码位 672 个。注: 区尽管对用户开放,但限制使用,因为不排除未来在此区域增补新字符的可能性。
3. GBK的编码表

file
GBK编码的开始部分

完整的编码表参见:GBK 编码表

2.2.3.5. GB18030

1. 什么是GB18030?

GB 18030全称:“国家标准GB 18030-2005《信息技术中文编码字符集》”,是中华人民共和国现时最新的内码字集。GB 18030GB 2312完全兼容,也与GBK兼容,支持GB 13000及Unicode的全部统一汉字,共收录汉字70244个。支持中国国内少数民族的文字,不需要动用造字区;汉字收录范围包含繁体汉字以及日韩汉字。

相较于GBK,GB 18030主要新增了中国少数民族的语言字符,如:藏文、规范彝文、朝鲜文、维哈柯文、蒙古文、滇东北苗文、傈僳文、西双版纳新傣文、西双版纳老傣文、德宏傣文。

GB18030有三个版本:GB18030-2000GB18030-2005GB18030-2022。截止2024年9月,最新版本是GB18030-2022,相较于GB18030-2005新增了17000余个字符,其中包括196个中国国务院在2013年公布的《通用规范汉字》(2005版本不包含的部分)。

在本文中,没有指明版本的GB18030一般是指GB18030-2005

2. GB18030的编码规则

GB 18030采用多字节编码,每个字符可以由1个、2个或4个字节组成。

  • 单字节: 其值从0x000x7F,与 ASCII 编码兼容。
  • 双字节: 码位区间0x8140~0xFE7E0x8180~0xFEFE,也就是GBK的全部码位空间。占23940个码位,定义了21886个字符。
  • 四字节: 码位区间0x81308130~0xFE39FE39,占1587600个码位。
    (0x81308130~0xFE39FE39表示第一个字节的值从0x810xFE,第二个字节的值从0x300x39,第三个字节从0x810xFE,第四个字节从0x300x39。也就是上一小节“GBK和GB18030编码区间”图的粉红区域)
3. 官方对GB18030的介绍

我们看一下国家市场监督总局发布的一篇GB 18030介绍的文章《[一图读懂“GB 18030-2022
信息技术 中文编码字符集”](https://www.samr.gov.cn/cms_files/filemanager/samr/www/samrne...)》

2.2.3.6. 总结

字符编码兼容ASCII字节类型收集的主要字符类型备注
GB2312兼容单双字节简体中文两个字节首位都是0
Big5兼容单双字节繁体中文只保证第一个字节首位是0
GBK兼容单双字节GB2312基础上增加繁体中文、日文、韩文只保证第一个字节首位是0
GB18030兼容多字节
1、2、4个字节
GBK基础上增加中国的少数名族语言字符只保证第一个字节首位是0
  • 单双字节:小于128的ASCII字符时是单字节,其他字符(如汉字)是双字节。
  • 多字节:小于128的ASCII字符时是单字节,其他字符(如汉字)是双字节或四字节。

file


未完待续…… 欲知后事如何,且看下回分解。

下回预告:字符编码发展史4 — Unicode与UTF-8。

历史文章推荐:

字符编码发展史2 — ISO-8859-N
字符编码发展史1 — ASCII和EASCII

大家好,我是陌尘。

IT从业10年+, 北漂过也深漂过,目前暂定居于杭州,未来不知还会飘向何方。

搞了8年C++,也干过2年前端;用Python写过书,也玩过一点PHP,未来还会折腾更多东西,不死不休。

感谢大家的关注,期待与你一起成长。


SunLogging


陌尘
6 声望7 粉丝

花名(网名): 陌尘