GB/T 2312[注 1]GB/T 2312—80GB/T 2312—1980中华人民共和国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,通常简称GB(“国标”汉语拼音首字母),又称GB0,由中国国家标准总局于1980年发布,1981年5月1日实施。GB/T 2312编码通行于中国大陆新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB/T 2312。

GB 2312
MIME / IANAGB_2312-80 (EUC 名为GB2312
别名iso-ir-58, chinese, csGB2312, csISO58GB231280
语言简体中文, 英文
部分支援:
繁体中文, 西里尔文, 希腊文
标准GB/T 2312-1980
分类可支援ISO-2022双字节字元集中日韩编码
拓展成ISO-IR-165
编码格式EUC-CN (GB2312),
HZ-GB-2312
前用中文电码
后续GBKGB 18030
其他相关编码JIS X 0208KS X 1001

概述

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

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

分区表示

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

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

下列是 GB/T 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×000×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/T 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>[3][4]

EUC-CN(机内码、内码)

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

在 GB/T 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>[3][4]

HZ

HZ 编码是由李枫峰在1988年发明的编码系统[5]。其目的是在7字节的限制下(如电子邮件)储存 GB/T 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×4Dr的ASCII码是0×72)。[6]

修订

GB 5007.1—85《信息交换用汉字 24x24 点阵字模集》首次附录对 GB/T 2312之更正,包括:

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

GB/T 2312本身一直未有修订,但此等修订部份收入相关字模集(下详)、GB/T 12345、后续之GBKGB 18030

GB/T 2312亦用于ISO-IR-165

两种不同的GB/T 2312实现

有两种不同的GB/T 2312实现,在它们之间存在少量的差别,其中至少有一个是错误的。

区位码(EUC码) GBK子集 GB2312.TXT 字符名称[9]
01-04 (<A1 A4>) U+00B7 · MIDDLE DOT U+30FB KATAKANA MIDDLE DOT 间隔点
01-10 (<A1 AA>) U+2014 EM DASH U+2015 HORIZONTAL BAR 破折号

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

截至2015年 (2015-Missing required parameter 1=month!),微软.NET使用的是“GBK子集”实现。ICU英语International Components for Unicode[12]、libiconv-1.14、[13]php-5.6、ActivePerl-5.20、Java 1.7、Python 3.4[14]都使用“GB2312.TXT”实现。Ruby 2.2兼容两者编码,但内部使用“GBK子集”实现。W3C的编码技术指南规定,应将gb2312字节流视为GBK编码,与GB18030一并使用同一解码器解码。[15]

字模集

  • 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《图形信息交换用矢量汉字黑体字模集及数据集》

注释

  1. ^ 自2017年3月23日起,根据2017年第7号公告和强制性标准整合精简结论,该标准转化成推荐性标准,不再强制执行,由“GB 2312—80”改称为“GB/T 2312”。中国国家标准全文公开系统 - GB/T 2312-1980. 中国国家标准全文公开系统. [2020-03-30]. (原始内容存档于2021-02-27). 
  2. ^ ɑ(U+0251)
    ḿ(U+1E3F;Unicode 3.0 始开始收纳,故代码页936亦未收[7]
    ń(U+0144)
    ň(U+0148)
    ǹ(U+01F9;Unicode 3.0 始开始收纳,故代码页936亦未收[8]
    ɡ(U+0261)

参考文献

  1. ^ Lunde, Ken. CJKV information processing: Chinese, Japanese, Korean & Vietnamese computing 2nd Ed. Sebastopol, Calif: O'Reilly & Associates. : 239. ISBN 9780596514471. 
  2. ^ RFC 1922 (1996)
  3. ^ 3.0 3.1 品雪. 中文编码小知识. 知乎专栏. [2022-05-02] (中文). 
  4. ^ 4.0 4.1 Lunde, Ken Roger. CJKV Information Processing 第二版. O'Reilly. 2008年十二月 [2022-05-02]. ISBN 978-0-596-51447-1. (原始内容存档于2011-08-29). 
  5. ^ HZ — A Data Format for Exchanging Files of Arbitrarily Mixed Chinese and ASCII Characters. (原始内容存档于2005-10-27). 
  6. ^ HZ-GB-2312中文编码详解 - 云+社区 - 腾讯云. cloud.tencent.com. [2022-05-02]. (原始内容存档于2020-09-29). 
  7. ^ http://www.microsoft.com/globaldev/reference/dbcs/936/936_A8.mspx
  8. ^ http://www.microsoft.com/globaldev/reference/dbcs/936/936_A8.mspx
  9. ^ GB 2312-1980: Information technology—Chinese ideogram coded character set for information interchange (basic set). [2 October 2016]. 
  10. ^ 10.0 10.1 Haible, Bruno. GB2312 (Conversion Tables). [29 September 2016]. (原始内容存档于2016-10-20). 
  11. ^ Readme - MAPPINGS/OBSOLETE/EASTASIA. 9 August 2001 [29 September 2016]. (原始内容存档于2015-08-01). 
  12. ^ java-EUC_CN-1.3_P.ucm. [29 September 2016]. [永久失效链接]
  13. ^ libiconv:lib/gb2312.h. GNU Savannah. [29 September 2016]. 
  14. ^ Issue 24036. Python Bug Tracker. [2015-04-24]. (原始内容存档于2016-03-04). 
  15. ^ Encoding § Names and labels. W3C. [29 September 2016]. (原始内容存档于2017-03-18). 

外部链接

参见