GB 2312

来自GSXAB的知识库
GB2312
术语名称 GB2312
英语名称 GB2312

GB 2312[1]中国国家标准总局颁布的国家标准,是官方字符集字符编码之一,标准名为《信息交换用汉字编码字符集》,标准号为 GB/T 2312-1980 ,可简称 GB/T 2312 。其中 2017.3.23 起由强制标准转化为推荐性标准,但由于作为强制标准时间较长,以及相关注册时已经使用 GB 2312 的名称,在多数场合下仍然会继续称之为 GB 2312 、 GB 2312-80 或 GB 2312-1980 。

GB 2312 是一种编码空间为 94×94 的字符集,其对应的字符编码方案有多种。首先码位本身称为区位码;其次与 ISO 2022 兼容,也作为其中的 ISO-2022-CN 编码的一部分;单独使用时,每个分量被 0x20 偏移的称为国标码/交换码;符合 EUC 系列的字符编码规范,被 0xA0 偏移的称为机内码,也被称为 EUC-CN 编码,或直接称为 GB 2312 编码。

字符集特征

收录了特殊符号以及被称为一二级汉字的两个区,字符集中一共有 7445 个字符:

  • 特殊符号: 682 个。包含标点符号、假名、希腊字母、西里尔字母、非 ASCII 的拼音字母、注音符号等。
  • 一级汉字: 3755 个。
  • 二级汉字: 3008 个。

需要注意这个一级汉字和二级汉字的标准不是《通用规范汉字表》(8105 标准)等常用字规范中的一级汉字和二级汉字,这是两系列并行的标准。

码位特征

在 GB 2312 94×94 的编码空间中,码位由高低两个字节组成,可以看作二元组。其第一分量(行编号)称为,第二分量称为。区位都使用 0 填充的两位数字表示,表示为 01-94 ,如第一个汉字“啊”的区码为 16 ,位码为 01 。区位合称为区位码(qūwèi code),可以认为“区位码”一词就是“码位”在 GB 2312 中的实现。如“啊”的区位码为 1601 。

整体而言, GB 2312 编码空间按以下规则分布:

  • 01-09 区:特殊符号。
  • 16-55 区:一级汉字。 55 区的 90-94 未分配。
  • 56-87 区:二级汉字。
  • 10-15 区及 88-94 区:未分配。

常见编码

区位码

区位码本身虽然不直接用在计算机上进行二进制存储传输,由于长度固定且四位数便于记忆,在使用打孔卡的场景下仍然大量使用。

ISO-2022-CN

GB 2312 符合 ISO 2022 中 94 宽度字符集的规则,在 ISO-2022-CN 中也使用了相应编码,见 ISO 2022

同样按照这一规则, 1990 年代各国都在编码中避开控制区(0x00-1F),使用后面的 96 个位置进行编码(如果考虑 ISO 2022 中 0x20 和 0x7F 是固定位置,也会排除 0x20 和 0x7F )。也就是说,编码在 0x21-7E 范围内。因此,不涉及 ISO 2022 切换字符集的场景下,有以下几种编码。

交换码

国标码交换码:将区位分别加上偏移量 0x20 ,也就是说编码为 0x21-7E 的双字节。由于这种方式不完全兼容 ASCII ,对设施有一定不兼容。事实上, 03 区编码的就是 ASCII 的变体,严格地说是 ISO 646-CN ,只是通常被实现为全角字符,硬要用应该可不是不可以,但是软件生态造成的阻力较大,因此这种编码很少使用。

机内码

机内码内部代码,通常简称内码:将国标码区位分别加上偏移量 0x80 ,或者说原始的区位分别加上 0xA0 ,也就是说编码为 0xA1-0xFE 的双字节。这种做法和大部分 ISO 8859 系列编码类似,都留出了对应的 ASCII 兼容部分和控制字符,被称为 EUC-CN 。

HZ 编码

HZ 编码(缩写自 Hanzi),仅用于邮件和 Usenet 中,是 ISO-2022-CN 的简化代替:由于电子邮件的协议 SMTP 以及当时新闻组中广泛使用的 Usenet 分布式讨论系统的协议 NNTP (后被万维网带来的 BBS 和论坛,以及 RSS 代替)都只允许正文中使用 7 位 ASCII 字符,部分硬件设施不支持 0x80 以上的字节,还有部分国家的国际网关会主动过滤 0x80 以上的字节。这一方法中使用 ASCII 文字范围内的转义序列进行状态切换:

  • ~{ 从 ASCII 模式改为 HZ 模式
  • ~} 从 HZ 模式改为 ASCII 模式
  • ~~ ASCII 模式中代表 ~ 本身
  • ~\n ASCII 模式换行
  • ~[!-z|] 保留用途

这一编码也称为 HZ-GB-2312 ,被收录为 RFC 1842 。

使用

GB 2312 机内码是代码页 936 的基础,在中国大陆随着 Windows 系统被广泛使用,几乎全部汉字处理、通信等该场景都能看到这一字符编码。以这一字符集为基础的字体,经常后缀有“_GB2312”,这些字体仍然是部分场合下的标准,尽管这些字体在部分人名、地名、古汉语罕用字方面会出现一些出现字体回退到默认字体的问题,很多时候仍然是强制要求。

GB 2312 在 Unicode 流行前,曾经是最主流的编码,现在也有不少使用。尽管这一标准仅覆盖常用字,并因此在早期信息化时代造成了一些问题,但是仍然是一大突破。目前,这一标准已经退居推荐标准,其应用场合正在逐渐变为要求能够展示 GB 18030 中的所有字符。而且,由于 GB 2312 曾经是简体中文的标准字符集,在使用简体中文的马来西亚新加坡等国家,以及中国香港中国澳门等需要和内地信息交互的地区也有使用。

目前看来,由于国内场景逐渐以 GB 18030 作为主要标准,未来 GB 2312 的场景会被其取代,除了部分无法支持更长字节数字符的场景。国际场景则随着 Unicode 字符集的发展,网络场景及跨语言场景都在不断向 UTF-8 迁移以减少地区字符集不兼容造成的各种难以解决的问题。


常见字符编码
早期编码 电报码、 BCD 码BCDICEBCDIC)、ASCIIISO 646
ISO 8859 ISO 8859-1 、 ISO 8859-2 、……
国标系列 IBM 代码页 936 / GB 2312IBM 代码页 1386 / GBKIBM 代码页 54936 / GB 18030
Unicode / ISO 10646 UTF-7 、 UTF-8UTF-16UTF-32
  1. 读作“国标二三幺二”。