GB 2312

GB 2312，在计算机科学领域内通常简称GB（或简称GB0），是指依据中华人民共和国推荐性国家标准《信息交换用汉字编码字符集·基本集》（GB/T 2312-1980）制定的简体中文字符集。

## 历史

该种编码由中国国家标准总局于1980年发布，1981年5月1日实施。该种编码通行于中国大陆；新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312编码。

GB 2312标准共收录6763个汉字，其中一级汉字3755个，二级汉字3008个；同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、注音符号、俄语西里尔字母在内的682个字符。

GB 2312编码的出现，基本满足了汉字的计算机处理需要，它所收录的汉字已经覆盖中国大陆99.75%的使用频率。但对于人名、古汉语等方面出现的罕用字和繁体字，“GB 2312”编码不能处理，而是由一系列的国标辅助集负责编码和显示（如GB/T 12345《信息交换用汉字编码字符集 第一辅助集》、GB/T 7589 《信息交换用汉字编码字符集 第二辅助集》及GB/T 7590《信息交换用汉字编码字符集 第四辅助集》），但是 ISO-2022-CN-EXT 最终未给国标除了 “GB 2312”编码 以外的其他辅助集提供逃逸字符串。后来GBK及GB 18030汉字字符集相继出现以解决这些问题。

## 分区表示

“GB 2312”编码中对所收汉字进行了“分区”处理，每区含有94个汉字／符号，共计94个区。实际上，“GB 2312”编码只使用了87区。

用所在的区和位来表示字符（实际上就是码位）的方法称为区位码（或许叫“区位号”更为恰当）。例如“万”字在45区82位，所以“万”字的区位码是 45-82（45是“区码”，82是“位码”）。在储存进电脑时，电脑会在区位码上加上特定数字后才保存进内存以确保和其他编码兼容（如 ASCII）。转码后，区位码的“区码”会变成“高位字节”，而“位码”会变成“低位字节”。

下列是“GB 2312”编码分区后在区段内储存的字符：

- 01~09区（682个）：特殊符号、数字、英文字符、制表符等，包括拉丁字母、希腊字母、日文平假名及片假名字母、注音符号、俄语西里尔字母等在内的682个全角字符。
- 10~15区：空区，留待扩展；在附录3，第10区推荐作为 GB 1988—80 中的94个图形字符区域（即第3区字符之半形版本）。
- 16~55区（3755个）：常用汉字（也称一级汉字），按拼音排序。
- 56~87区（3008个）：非常用汉字（也称二级汉字），按部首/笔画排序。
- 88~94区：空区，留待扩展。

## 字节结构

在“GB 2312”字符集内，每个汉字及符号的码位使用两个字节来表示。第一个字节称为“高位字节”，对应分区的编号（把区位码的“区码”加上特定值）；第二个字节称为“低位字节”，对应区段内的个别码位（把区位码的“位码”加上特定值）。

### ISO 2022-CN（国标码、交换码）

为了避开ASCII字符中的不可显示字符（十六进制为`0×00`至`0×1F`，十进制为0至31）及空格字符（十六进制为`0×20`，十进制为32），国标码（又称为交换码）参考 ISO 2022 规定表示非 ASCII 字符双字节编码范围为十六进制为 `<21 21>`-`<7E 7E>`，十进制为 (33, 33) 至 (126, 126)。因此，在进行码位转换时，须将“区码”和“位码”分别加上32（十六进制为`0×20`）作为国标码。

在这个编码模式内，软件需要使用低端控制字符（C0），高端控制字符（C1）和US-ASCII字符集（GL）标注字符属于单字节（ASCII）还是双字节，相对容易造成乱码（如丢失控制/转义字符）。

在 “GB 2312”编码内，高位字节使用了`0x21—0x77`（把01—87区的区号加32或`0×20`），低位字节使用了`0x21—0x7E`（把01—94加上32或`0×20`）。

例：“万”字（区位码 45-82）的 ISO 2022 码十进制为：(45+32, 82+32) = (77, 114)，十六进制为：`<4D 72>`。

### EUC-CN（机内码、内码）

因为国标码和通用的ASCII码冲突，因此后续为了方便辨认单字节和双字节的编码，部分厂商在 ISO 2022 的基础上把双字节字符的二进制最高位都从 0 换成 1，即相当于把 ISO 2022 的每个字节都再加上128（十六进制为`0×80`）得到“机内码”表示，简称“内码”。把“区码”和“位码”分别加上160（十六进制为`0×A0`）也可以得到相同的机内码表示，这种格式也就是EUC。使用“GB 2312”编码的程序通常采用 EUC 储存方法，以便兼容于ASCII。这种格式称为EUC-CN。浏览器编码表上的“GB2312”就是指这种表示法。

在 “GB 2312”编码内，高位字节使用了`0xA1—0xF7`（把01—87区的区号加160或`0×A0`），低位字节使用了`0xA1—0xFE`（把01—94加上160或`0×A0`）。非 ASCII 字符双字节编码范围为十六进制为 `<A1 A1>`-`<FE FE>`，十进制为 (161, 161) 至 (254, 254)。

例：“万”字（区位码 45-82）的 EUC 码十进制为：(45+160, 82+160) = (205, 242)，十六进制为：`<CD F2>`。

### HZ

HZ 编码是由李枫峰在1988年发明的编码系统。其目的是在7字节的限制下（如电子邮件）储存 “GB 2312”编码 的双字节字符。其在 ISO 2022 编码字符的前后分别加上转义字符`~{`（`7E 7B`）和`~}`（`7E 7D`）后，使用正常的ASCII转码变成 ASCII 字符。部分机器也可以接受使用 EUC-CN 编码的转义字符。

例：“万”字（区位码 45-82）的 ISO 2022 码十六进制为 `<4D 72>`。加上转义字符后，字符串变成`7E 7B '''4D 72''' 7E 7D`。HZ的编码即为`~{Mr~}`（`M`的ASCII码是`0×4D`，`r`的ASCII码是`0×72`）。

## 修订

《信息交换用汉字 24x24 点阵字模集》（GB 5007.1—85）首次附录对 “GB 2312”编码之更正，包括：

- 调整拉丁字母“g”的字形
- 补充六个拼音符号 ɑ ḿ ń ň ǹ ɡ，用于汉语拼音
- “锺”更正为“锺”
- 于第10区补充94个半字图形字符（第3区之半形版本，相当于GB 1988—80）
- 于第11区加入第8区首32个拼音符号（包括以上补充六个）之半形版本。

GB 5007.1—1985曾将“麹”（84—80）更换成“麹”，但是后续修订（GB 5007.1—2001 和 GB/T 5007.1—2010）和其他字模集仍旧保留 “GB 2312”编码的繁体偏旁“麦”之“麹”。

“GB 2312”编码本身一直未有修订，但此等修订部分收入相关字模集（下详）、GB/T 12345、后续之GBK及GB 18030。

“GB 2312”编码亦用于ISO-IR-165。

## 两种不同的“GB 2312”编码实现

有两种不同的“GB 2312”编码实现，在它们之间存在少量的差别，其中至少有一个是错误的。

区位码（EUC码）｜GBK子集｜GB2312.TXT｜字符名称

01-04 ｜00B7｜30FB｜间隔点

01-10 ｜破折号

GBK子集与GBK/GB 18030兼容，GB2312.TXT则不兼容。后者基于ftp.unicode.org曾经提供的GB2312.TXT实现，于2011年由官方弃用，2016年9月时已无原文件踪迹。此外还有很多种厂商实现。

微软.NET使用的是“GBK子集”实现。万国码国际化组件、libiconv-1.14、php-5.6、ActivePerl-5.20、Java 1.7、Python 3.4都使用“GB2312.TXT”实现。Ruby 2.2兼容两者编码，但内部使用“GBK子集”实现。W3C的编码技术指南规定，应将`gb2312`字节流视为GBK编码，与GB18030一并使用同一解码器解码。

## 字模集

- GB 5007.1—1985《信息交换用汉字 24×24 点阵字模集》
- GB 5007.2—1985《信息交换用汉字 24×24 点阵字模数据集》
- GB 5199.1—1985《信息交换用汉字 15×16 点阵字模集》
- GB 5199.2—1985《信息交换用汉字 15×16 点阵字模数据集》
- GB 6345.1—1986《信息交换用汉字 32×32 点阵字模集》
- GB 6345.2—1986《信息交换用汉字 32×32 点阵字模数据集》
- GB/T 12034—1989《信息交换用汉字 32×32 点阵仿宋体字模集及数据集》
- GB/T 12035—1989《信息交换用汉字 32×32 点阵楷体字模集及数据集》
- GB/T 12036—1989《信息交换用汉字 32×32 点阵黑体字模集及数据集》
- GB/T 12037—1989《信息交换用汉字 36×36 点阵宋体字模集及数据集》
- GB/T 12038—1989《信息交换用汉字 36×36 点阵仿宋体字模集及数据集》
- GB/T 12039—1989《信息交换用汉字 36×36 点阵楷体字模集及数据集》
- GB/T 12040—1989《信息交换用汉字 36×36 点阵黑体字模集及数据集》
- GB/T 12041—1989《信息交换用汉字 48×48 点阵宋体字模集及数据集》
- GB/T 12042—1989《信息交换用汉字 48×48 点阵仿宋体字模集及数据集》
- GB/T 12043—1989《信息交换用汉字 48×48 点阵楷体字模集及数据集》
- GB/T 12044—1989《信息交换用汉字 48×48 点阵黑体字模集及数据集》
- GB/T 13443—1992《信息交换用汉字 128×128 点阵楷体字模集及数据集》
- GB/T 13444—1992《信息交换用汉字 128×128 点阵仿宋体字模集及数据集》
- GB/T 13445—1992《信息交换用汉字 256×256 点阵楷体字模集及数据集》
- GB/T 13446—1992《信息交换用汉字 256×256 点阵仿宋体字模集及数据集》
- GB/T 13844—1992《图形信息交换用矢量汉字单线宋体字模集及数据集》
- GB/T 13845—1992《图形信息交换用矢量汉字宋体字模集及数据集》
- GB/T 13846—1992《图形信息交换用矢量汉字仿宋体字模集及数据集》
- GB/T 13847—1992《图形信息交换用矢量汉字楷体字模集及数据集》
- GB/T 13848—1992《图形信息交换用矢量汉字黑体字模集及数据集》

## 参见

- 同一时期的其他汉字编码：大五码、中文标准交换码、中文资讯交换码、香港增补字符集、JIS X 0208
- 统一码、通用字符集（ISO/IEC 10646）
- 中日韩统一表意文字
- GB/T 12345

## 外部链接

- GB2312 80信息交换用汉字编码字符集 基本集 - 中华人民共和国教育部政府门户网站
- TransWiki中文 - GB2312汉字拼音对照表
- GB2312 简体中文编码表
- 信息交换用汉字编码字符集属性（官方）
- GB 2312-80 (CJKV Information Processing,Appendix E) "STSong-Light" font designed by Changzhou SinoType Technology
- 図书馆员のコンピュータ基础讲座：GB 2312-80コード表

## 基本资料

- 日语原文：信息交换用汉字编码字符集·基本集、（GB 2312）
- _nomimecode：1
- mime：`GB_2312-80` （EUC 名为`GB2312`）
- 别名：iso-ir-58, chinese, csGB2312, csISO58GB231280
- 标准：GB/T 2312-1980
- 语言：简体中文, 英文、部分支援：、繁体中文, 西里尔文, 希腊文
- 分类：可支援ISO-2022双字节字元集，中日韩统一表意文字编码
- 编码格式：EUC-CN (`GB2312`)、HZ-GB-2312
- 拓展成：ISO-IR-165
- 前用：中文电码
- 后续：GBK，GB 18030
- 其他相关编码：JIS X 0208，KS X 1001