GB 18030 (全称《信息技术 中文编码字符集》)是中华人民共和国国家标准 简体中文 字符集 ,由中华人民共和国信息产业部 提出、信息产业部电子工业标准化研究所归口。其向后兼容 并替代GB 2312-1980 、GBK 和CP936 传统编码,并支持Unicode (GB 13000 )的所有码位。GB 18030采用变长多字节 编码,每个字可以由1个、2个或4个字节组成。其编码空间庞大,最多可定义161万个字元。由于GB 18030完全支持Unicode,无需动用造字区即可支持中日韩统一表意文字 、中国国内的少数民族 文字以及emoji 等字符。GB 18030在微软Windows 系统中的代码页 为54936 。
除编码方法外,GB 18030还包含其他文字和语言以及本标准适用对象的要求。不过,GB 18030不是一个汉字规范 ,不定义汉字的正式字形;字形由《通用规范汉字表 》进行规范。
版本
本标准的第一版 GB 18030-2000《信息技术 信息交换用汉字编码字符集 基本集的扩充》 由中华人民共和国信息产业部 电子工业标准化研究所、北京大学 计算机技术研究所、北大方正集团 、北京方正新天地信息网络科技有限责任公司、四通集团公司 、中国科学院软件研究所 、长城软件公司、四通利方公司 、中国软件与技术服务股份有限公司、金山软件公司 和联想集团 起草,由国家质量技术监督局 于2000年3月17日发布和实施。此版本兼容Unicode 3.0的中日韩统一表意文字扩展区A ,共收录27,533个汉字。
本标准的第二版 GB 18030-2005《信息技术 中文编码字符集》 由国家质量监督检验检疫总局 和中国国家标准化管理委员会 于2005年11月8日发布,并于2006年5月1日实施。此版本兼容Unicode 3.1的中日韩统一表意文字扩展区B ,并刊载少数民族包括朝鲜文 、蒙古文 (包括满文 、托忒文 、锡伯文 、阿礼嘎礼文 )、德宏傣文 、藏文 、维吾尔文 /哈萨克文 /柯尔克兹文 和彝文 的文字。共有70,244个汉字。此标准内的单字节编码部分、双字节编码部分,和四字节编码部分收录的少数中日韩统一表意文字扩展区A的汉字,为强制性标准。其他部分则属于规模性标准。在中华人民共和国境内所有软件产品,都需要支持这个同时包含单字节、双字节和四字节编码的规格。[ 1] :4
本标准的第三版 GB 18030-2022《信息技术 中文编码字符集》 由国家市场监督管理总局 和中国国家标准化管理委员会于2022年7月19日发布,并于2023年8月1日实施[ 2] 。此版本兼容到Unicode 11为止的中日韩统一表意文字扩展区C 、D 、E 和F ,并新增康熙部首 ,以及滇东北苗文 、傈僳文 、西双版纳新傣文 、西双版纳老傣文 、德宏傣文 等少数民族文字以及蒙古文 BIRGA 符号 ,共收录汉字87,887个和汉字部首228个,比上一版增加录入了1.7万余个生僻汉字。此版本在保留总体结构的基础上,从条文强制改为全文强制,但增加了“实现的级别”一章,定义了三个实现级别:
级别1:支持中日韩统一表意文字和中日韩统一表意文字扩展区A的汉字(所有具备中文信息处理 和交换功能的产品均应满足此级别。与上一版的“部分强制”相比,实际要求“增加四字节编码部分的CJK统一汉字”的 66 字。)
级别2:在级别1的基础上额外支持资料性附录E中明确的《通用规范汉字表 》中没有包含在级别1之内的 8105 个汉字(操作系统 、数据库管理系统 、中间件 等系统软件 和支撑软件均应满足此级别。)
级别3:支持GB 18030-2022中所规定的全部汉字以及康熙部首 (GB/T 4754《国民经济行业分类 》中任何用于政务服务和公共服务 的信息技术产品和信息系统 应均满足此级别。)
Unicode支持
不同GB 18030版本中Unicode码位的映射更动
GB 字节串
Unicode 码位
GB 18030-2000
GB 18030-2005
A8 BC (ḿ)
U+E7C7
U+1E3F ḿ
81 35 F4 37
U+1E3F ḿ
U+E7C7
GB 18030在其标准中以码表形式定义了除去代理对 外的全部Unicode码位的定义。由于GB 18030基本上是绕开已分配的码点去指定需要对应的Unicode,其变换和UTF-8 相比要复杂得多。在日常实现上,常常会直接使用一个偏移量表[ 3] 。
GB 18030-2005与GB 18030-2000、GBK相比,去除了很多原来映射在PUA 中的编码;后来剩余的24个PUA码位也在Unicode 4.1中加上。
在GB 18030-2022中,剩余的24个PUA码位已经被去除或更改对应,所有有意义字符都已经映射到正式的 Unicode 码位上。[ 4]
国标码 码表中 私有区 码位 的演变
GB 字节串
Unicode 码位 [a]
GBK 1.0[ 5]
GB 18030-2005
Unicode 4.1
GB 18030-2022[ 4]
A6 D9[ 6] :108
U+E78D
U+FE10 ︐
A6 DA
U+E78E
U+FE12 ︒
A6 DB
U+E78F
U+FE11 ︑
A6 DC
U+E790
U+FE13 ︓
A6 DD
U+E791
U+FE14 ︔
A6 DE
U+E792
U+FE15 ︕
A6 DF
U+E793
U+FE16 ︖
A6 EC
U+E794
U+FE17 ︗
A6 ED
U+E795
U+FE18 ︘
A6 F3
U+E796
U+FE19 ︙
A8 BC
U+E7C7
U+1E3F ḿ
A8 BF
U+E7C8
U+01F9 ǹ
A9 89
U+E7E7
U+303E 〾
A9 8A
U+E7E8
U+2FF0 ⿰
A9 8B
U+E7E9
U+2FF1 ⿱
A9 8C
U+E7EA
U+2FF2 ⿲
A9 8D
U+E7EB
U+2FF3 ⿳
A9 8E
U+E7EC
U+2FF4 ⿴
A9 8F
U+E7ED
U+2FF5 ⿵
A9 90
U+E7EE
U+2FF6 ⿶
A9 91
U+E7EF
U+2FF7 ⿷
A9 92
U+E7F0
U+2FF8 ⿸
A9 93
U+E7F1
U+2FF9 ⿹
A9 94[ 6] :173
U+E7F2
U+2FFA ⿺
A9 95
U+E7F3
U+2FFB ⿻
FE 50
U+E815
U+2E81
FE 51
U+E816
U+20087 𠂇 [b]
U+E816
FE 52
U+E817
U+20089 𠂉 [c]
U+E817
FE 53
U+E818
U+200CC 𠃌 [d]
U+E818
FE 54
U+E819
U+2E84
FE 55
U+E81A
U+3473 㑳
FE 56
U+E81B
U+3447 㑇
FE 57
U+E81C
U+2E88
FE 58
U+E81D
U+2E8B ⺋
FE 59
U+E81E
U+9FB4 龴
FE 5A
U+E81F
U+359E 㖞
FE 5B
U+E820
U+361A 㘚
FE 5C
U+E821
U+360E 㘎
FE 5D
U+E822
U+2E8C ⺌
FE 5E
U+E823
U+2E97
FE 5F
U+E824
U+396E 㥮
FE 60
U+E825
U+3918 㤘
FE 61
U+E826
U+9FB5 龵
FE 62
U+E827
U+39CF 㧏
FE 63
U+E828
U+39DF 㧟
FE 64
U+E829
U+3A73 㩳
FE 65
U+E82A
U+39D0 㧐
FE 66
U+E82B
U+9FB6 龶
FE 67
U+E82C
U+9FB7 龷
FE 68
U+E82D
U+3B4E 㭎
FE 69
U+E82E
U+3C6E 㱮
FE 6A
U+E82F
U+3CE0 㳠
FE 6B
U+E830
U+2EA7 <control-2EA7>
FE 6C
U+E831
U+215D7 𡗗 [e]
U+E831
FE 6D
U+E832
U+9FB8 龸
FE 6E
U+E833
U+2EAA ⺪
FE 6F
U+E834
U+4056 䁖
FE 70
U+E835
U+415F 䅟
FE 71
U+E836
U+2EAE ⺮
FE 72
U+E837
U+4337 䌷
FE 73
U+E838
U+2EB3 <control-2EB3>
FE 74
U+E839
U+2EB6 <control-2EB6>
FE 75
U+E83A
U+2EB7 <control-2EB7>
FE 76
U+E83B
U+2298F 𢦏 [f]
U+E83B
FE 77
U+E83C
U+43B1 䎱
FE 78
U+E83D
U+43AC 䎬
FE 79
U+E83E
U+2EBB ⺻
FE 7A
U+E83F
U+43DD 䏝
FE 7B
U+E840
U+44D6 䓖
FE 7C
U+E841
U+4661 䙡
FE 7D
U+E842
U+464C 䙌
FE 7E
U+E843
U+9FB9 龹
FE 80
U+E844
U+4723 䜣
FE 81
U+E845
U+4729 䜩
FE 82
U+E846
U+477C 䝼
FE 83
U+E847
U+478D 䞍
FE 84
U+E848
U+2ECA ⻊
FE 85
U+E849
U+4947 䥇
FE 86
U+E84A
U+497A 䥺
FE 87
U+E84B
U+497D 䥽
FE 88
U+E84C
U+4982 䦂
FE 89
U+E84D
U+4983 䦃
FE 8A
U+E84E
U+4985 䦅
FE 8B
U+E84F
U+4986 䦆
FE 8C
U+E850
U+499F 䦟
FE 8D
U+E851
U+499B 䦛
FE 8E
U+E852
U+49B7 䦷
FE 8F
U+E853
U+49B6 䦶
FE 90
U+E854
U+9FBA 龺
FE 91
U+E855
U+241FE 𤇾 [g]
U+E855
FE 92
U+E856
U+4CA3 䲣
FE 93
U+E857
U+4C9F 䲟
FE 94
U+E858
U+4CA0 䲠
FE 95
U+E859
U+4CA1 䲡
FE 96
U+E85A
U+4C77 䱷
FE 97
U+E85B
U+4CA2 䲢
FE 98
U+E85C
U+4D13 䴓
FE 99
U+E85D
U+4D14 䴔
FE 9A
U+E85E
U+4D15 䴕
FE 9B
U+E85F
U+4D16 䴖
FE 9C
U+E860
U+4D17 䴗
FE 9D
U+E861
U+4D18 䴘
FE 9E
U+E862
U+4D19 䴙
FE 9F
U+E863
U+4DAE 䶮
FE A0
U+E864
U+9FBB 龻
备注
a.^ 蓝色 代表私用区码位
b.^ GB 18030-2022将U+20087 𠂇 映射至0x95329031
c.^ GB 18030-2022将U+20089 𠂉 映射至0x95329033
d.^ GB 18030-2022将U+200CC 𠃌 映射至0x95329730
e.^ GB 18030-2022将U+215D7 𡗗 映射至0x9536B937
f.^ GB 18030-2022将U+2298F 𢦏 映射至0x9630BA35
g.^ GB 18030-2022将U+241FE 𤇾 映射至0x9635B630
字节结构
GB 18030包含三种长度的编码:单字节的ASCII 、双字节的GBK (略带扩展)、以及用于填补所有Unicode码位的四字节UTF区段。GBK双字节部分通过查表定义,而四字节部分则根据之前两个部分没有提到的通用字符集 码位顺序填补。由于和GBK兼容,GB 18030在搜索ASCII字符时也需要使用特别代码进行判断。
GB 18030编码[ 7] :3 [ 8] :252 [ 9]
GB 18030
码位 数
Unicode[ b]
字节1(最高位)
字节2
字节3
字节4
00
– 7F
128
0000
– 007F
80
—
错误[ c]
81
– FE
40
– FE
除去 7F
[ d]
7004239400000000000♠ 23940
0080
– FFFF
除去 D800
– DFFF
[ e]
81
– 84
30
– 39
81
– FE
30
– 39
7004394200000000000♠ 39420
85
— (7004126000000000000♠ 12600 )
(未来字符拓展)
86
– 8F
— (7005126000000000000♠ 126000 )
(未来汉字拓展)
无
—
D800
– DFFF
[ f]
90
– E3
30
– 39
81
– FE
30
– 39
7006104857600000000♠ 1048 576
1 0000
– 10 FFFF
E4
– FC
— (7005315000000000000♠ 315000 )
(未来标准拓展)
FD
– FE
— (7004252000000000000♠ 25200 )
(用户造字区域)
FF
—
错误
总计
7006111206400000000♠ 1112 064
一、二字节区段基本就是GBK 编码,另外加上了专门的欧元字符、竖排版本的标点符号,以及造字区对Unicode造字区的对应。四字节区段可以视作两段形似GBK二字节区段结构的部分,每段的第一字节可以为0x81到0xFE,第二字节为0x30到0x39。由于结构类似,能够安全于GBK的字符串搜索程序对于GB 18030来说也基本安全(正如基于字节 的搜索程序对于EUC 、UTF-8 也基本安全一般。)
四字节区段总共可以表达1,587,600(126×10×126×10)种字符,足以覆盖Unicode 的1,112,064(17×65536 − 2048个代理对)个有效码位。
由于四字节区段通过填空定义,要写出处理这段转换的程序需要同时知道GBK的覆盖范围,并不简单:
U+00DE (Þ) → 81 30 89 37
U+00DF (ß) → 81 30 89 38
U+00E0 (à) → A8 A4
U+00E1 (á) → A8 A2
U+00E2 (â) → 81 30 89 39
U+00E3 (ã) → 81 30 8A 30
WHATWG 和W3C 的GB 18030实现通过一张“位置偏移表”记录GB 18030四字节区中连续的几块碎片,以便高效处理转换。[ 11] ICU[ 9] 和glibc也都对大块连续的区域使用了类似的策略。
参见
注釋
^ 严格来说不是,因为ASCII字节会出现在GBK拓展二字节部分的后半字
^ 包含66个“非字符”
^ 虽然两个版本的GB 18030都认为此码位不正确(指正式发布的,GB 18030-2000的报批稿却同时有单双字节欧元[ 10] ),但是ICU的定义错误称其为有效码位。出于GBK兼容性考虑,WHATWG 的GBK/GB 18030二合一解码器将此字节视作欧元符号。
^ 参见汉字内码扩展规范 条目细分。
^ 上一行的码位使用二字节GBK编码,下一行的码位按照顺序以四字节编码补全覆盖面。此段最后一个实际用上的编码为U+FFFF的84 31 A4 39
(2005版239页),不过划区时画到了84 39 FE 39
。
^ 这些为代理对字符 ,在UTF-16 之外没有实际意义。
参考资料
外部連結