Unicode、GB2312、GBK和GB18030中的汉字


GB18030有两个版本:GB18030-2000和GB18030-2005。GB18030-2000是GBK的取代版本,它的主要特点是在GBK基础上增加了CJK统一汉字扩充A的汉字。GB18030-2005的主要特点是在GB18030-2000基础上增加了CJK统一汉字扩充B的汉字。本文数一数GB18030中的汉字,也顺便看看其它标准中的汉字。

1 Unicode中的汉字

在Unicode 5.0的99089个字符中,有71226个字符与汉字有关。它们的分布如下:

Block名称

开始码位

结束码位

字符数

CJK统一汉字

4E00

9FBB

20924

 

CJK统一汉字扩充A

3400

4DB5

6582

 

CJK统一汉字扩充B

20000

2A6D6

42711

 

CJK兼容汉字

F900

FA2D

302

 

CJK兼容汉字

FA30

FA6A

59

 

CJK兼容汉字

FA70

FAD9

106

CJK兼容汉字补充

2F800

2FA1D

542

如果不算兼容汉字,Unicode目前支持的汉字总数是20924+6582+42711=70217。

这里有一个细节。在早期的Unicode版本中,CJK统一汉字区的范围是0x4E00-0x9FA5,也就是我们经常提到的20902个汉字。当前版本的Unicode增加了22个字符,码位是0x9FA6-0x9FBB。它们是:

Unicode、GB2312、GBK和GB18030中的汉字_ico

那么GB18030是否支持这22个字符?后面还会讨论。

2 GB2312

1980年的GB2312一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。

这6763个汉字在Unicode中不是连续的,分布在CJK统一汉字字符区(0x4E00-0x9FA5)的20902个汉字中。

3 GBK

1995年的汉字扩展规范GBK1.0收录了21886个符号,包括21003个汉字和883个其它符号。

这21003汉字包括CJK统一汉字区的20902个汉字。余下的101个汉字包括:

  • 增补汉字和部首80个,包括28个部首和52个汉字。GBK编码是从FE50-FE7E,FE80-FEA0。下图标注了Unicode编码。

在制定GBK时,Unicode中还没有这些字符,所以使用了专用区的码位,这80个字符的码位是0xE815-0xE864。后来,Unicode将52个汉字收录到“CJK统一汉字扩充A”。28个部首中有14个部首被收录到“CJK部首补充区”。所以在上图中,这些字符都有两个Unicode编码。

上图中淡黄色背景的8个部首被收录到“CJK统一汉字区”的新增区域,即前面提到的0x9FA6-0x9FBB。还有6个淡灰色背景的部首被Unicode收录到“CJK统一汉字扩充B”(网友slt指正)。

请注意,淡黄色和淡灰色的14个字符按照GB18030还是应该映射到PUA码位。这14个字符与非PUA码位的映射关系只是网友找出来的,不是标准规定的。如果按照GBK编码,这80个字符应该全部映射到PUA码位。GB18030将其中66个字符映射到了非PUA码位。不过在Windows中,简体中文区域的默认代码页还是GBK,不是GB18030。

  • CJK兼容汉字区挑选出来的21个汉字。见下表:

汉字

GBK编码

Unicode编码


FD9C

F92C


FD9D

F979


FD9E

F995


FD9F

F9E7


FDA0

F9F1


FE40

FA0C


FE41

FA0D


FE42

FA0E


FE43

FA0F


FE44

FA11


FE45

FA13


FE46

FA14


FE47

FA18


FE48

FA1F


FE49

FA20


FE4A

FA21


FE4B

FA23


FE4C

FA24


FE4D

FA27


FE4E

FA28


FE4F

FA29

4 GB18030-2000

4.1 字汇

GB18030-2000的字汇部分是这样写的:


本标准收录的字符分别以单字节、双字节和四字节编码。

5.1 单字节部分

  本标准中,单字节的部分收录了GB 11383的0x00到0x7F全部128个字符及单字节编码的欧元符号。

5.2 双字节部分

  本标准中,双字节的部分收录内容如下:

  GB 13000.1的全部CJK统一汉字字符。

  GB 13000.1的CJK兼容区挑选出来的21个汉字。

  GB 13000.1中收录而GB 2312未收录的我国台湾地区使用的图形字符139个。

  GB 13000.1收录的其它字符31个。

  GB 2312中的非汉字符号。

  GB 12345 的竖排标点符号19个。

  GB 2312未收录的10个小写罗马数字。

  GB 2312未收录的带音调的汉语拼音字母5个以及ɑ 和ɡ 。

  汉字数字“〇”。 

  表意文字描述符13个。

  增补汉字和部首/构件80个。

  双字节编码的欧元符号。

5.3 四字节部分

  本标准的四字节的部分,收录了上述双字节字符之外的,包括CJK统一汉字扩充A在内的GB 13000.1 中的全部字符。



4.2 汉字

如下表所示,GB18030-2000收录了27533个汉字:

类别

码位范围

码位数

字符数

字符类型

双字节部分

第一字节 0xB0-0xF7

第二字节 0xA1-0xFE

6768

6763

汉字

第一字节0x81-0xA0

第二字节0x40-0xFE

6080

6080

汉字

第一字节0xAA-0xFE

第二字节0x40-0xA0

8160

8160

汉字

四字节部分

第一字节0x81-0x82

第二字节0x30-0x39

第三字节0x81-0xFE

第四字节0x30-0x39

6530

6530

CJK统一汉字扩充A

27533就是6763+6080+8160+6530。双字节部分的6763+6080+8160=21003个汉字就是GBK的21003个汉字。

在Unicode中,CJK统一汉字扩充A有6582个汉字,为什么这里只有6530个汉字?

这是因为在GBK时代,双字节部分已经收录过CJK统一汉字扩充A的52个汉字,所以还余6530个汉字。

5 GB18030-2005

5.1 字汇

GB18030-2005的字汇部分是这样写的:


本标准收录的字符分别以单字节、双字节或四字节编码。

5.1 单字节部分

  本标准中,单字节的部分收录了GB/T 11383-1989的0x00到0x7F全部128个字符。

5.2 双字节部分

  本标准中,双字节的部分收录内容如下:

  GB 13000.1-1993的全部CJK统一汉字字符。见附录A。

  GB 13000.1-1993的CJK兼容区挑选出来的21个汉字。见附录A。

  GB 13000.1-1993中收录而GB 2312未收录的我国台湾地区使用的图形字符139个。见附录A。

  GB 13000.1-1993收录的其它字符31个。见附录A。

  GB 2312中的非汉字符号。见附录A。

  GB 12345 的竖排标点符号19个。见附录A。

  GB 2312未收录的10个小写罗马数字。见附录A。

  GB 2312未收录的带音调的汉语拼音字母5个以及ɑ 和ɡ 。见附录A。

  汉字数字“〇”。 见附录A。

  表意文字描述符13个。见附录A和附录B。

  对GB 13000.1-1993增补的汉字和部首/构件80个。见附录A和附录C。

  双字节编码的欧元符号。见附录A。

5.3 四字节部分

  本标准的四字节的部分,收录了上述双字节字符之外的,GB 13000的CJK统一汉字扩充A、CJK统一汉字扩充B和已经在GB13000中编码的我国少数民族文字的字符。见附录D。



GB18030-2005最主要的变化是增加了CJK统一汉字扩充B。它还去掉了单字节编码的欧元符号(0x80)。

5.2 汉字

如下表所示,GB18030-2005收录了70244个汉字:

类别

码位范围

码位数

字符数

字符类型

双字节部分

第一字节 0xB0-0xF7

第二字节 0xA1-0xFE

6768

6763

汉字

第一字节0x81-0xA0

第二字节0x40-0xFE

6080

6080

汉字

第一字节0xAA-0xFE

第二字节0x40-0xA0

8160

8160

汉字

四字节部分

第一字节0x81-0x82

第二字节0x30-0x39

第三字节0x81-0xFE

第四字节0x30-0x39

6530

6530

CJK统一汉字扩充A

第一字节0x95-0x98

第二字节0x30-0x39

第三字节0x81-0xFE

第四字节0x30-0x39

42711

42711

CJK统一汉字扩充B

70244就是6763+6080+8160+6530+42711。

6 结束语

GB2312有6763个汉字,GBK有21003个汉字,GB18030-2000有27533个汉字,GB18030-2005有70244个汉字。

Unicode 5.0中,如果不算兼容区,目前有70217个汉字。让我们比较一下Unicode的70217汉字和GB18030-2005中的70244汉字:

GB18030-2005

Unicode 5.0

对应的Unicode编码

CJK统一汉字的20902汉字

CJK统一汉字的20902汉字

0x4E00-0x9FA5

CJK统一汉字扩充A的6582汉字

CJK统一汉字扩充A的6582汉字

0x3400-0x4DB5

CJK统一汉字扩充B的42711汉字

CJK统一汉字扩充B的42711汉字

0x20000-0x2A6D6

CJK部首补充区的14个部首

未计入

2E81, 2E84, 2E88, 2E8B, 2E8C, 2E97, 2EA7, 2EAA, 2EAE, 2EB3, 2EB6, 2EB7, 2EBB, 2ECA

CJK兼容汉字区的21个汉字

未计入

F92C, F979, F995, F9E7, F9F1, FA0C, FA0D, FA0E, FA0F, FA11, FA13, FA14, FA18, FA1F, FA20, FA21, FA23, FA24, FA27, FA28, FA29


Unicode、GB2312、GBK和GB18030中的汉字_描述符_02

”8个部首

CJK统一汉字区新增了这8个字符

0x9FB4-0x9FBB

未计入

CJK统一汉字区新增的14个字符

0x9FA6-0x9FB3

CJK统一汉字区新增的0x9FA6-0x9FB3这14个字符在GB18030中有对应的码位(0x82358F33-0x82358F39, 0x82359030-0x82359039, 0x82359130-0x82359134),不过GB18030没有列出这些字符。

附录1 GBK增补的80个汉字和部首

GBK增补的80个字符本来是放在PUA区的,后来又被Unicode收录。所以既可以用PUA区的编码表示,也可以用非PUA编码表示。正文中的表格可能不便复制,这里补充一张表格:

汉字

GBK编码

PUA编码

非PUA编码


FE50

E815

2E81


FE51

E816

20087


FE52

E817

20089


FE53

E818

200CC


FE54

E819

2E84


FE55

E81A

3473


FE56

E81B

3447


FE57

E81C

2E88


FE58

E81D

2E8B


FE59

E81E

9FB4


FE5A

E81F

359E


FE5B

E820

361A


FE5C

E821

360E


FE5D

E822

2E8C


FE5E

E823

2E97


FE5F

E824

396E


FE60

E825

3918


FE61

E826

9FB5


FE62

E827

39CF


FE63

E828

39DF


FE64

E829

3A73


FE65

E82A

39D0


FE66

E82B

9FB6


FE67

E82C

9FB7


FE68

E82D

3B4E


FE69

E82E

3C6E


FE6A

E82F

3CE0


FE6B

E830

2EA7


FE6C

E831

215D7


FE6D

E832

9FB8


FE6E

E833

2EAA


FE6F

E834

4056


FE70

E835

415F


FE71

E836

2EAE


FE72

E837

4337


FE73

E838

2EB3


FE74

E839

2EB6


FE75

E83A

2EB7


FE76

E83B

2298F


FE77

E83C

43B1


FE78

E83D

43AC


FE79

E83E

2EBB


FE7A

E83F

43DD


FE7B

E840

44D6


FE7C

E841

4661


FE7D

E842

464C


FE7E

E843

9FB9


FE80

E844

4723


FE81

E845

4729


FE82

E846

477C


FE83

E847

478D


FE84

E848

2ECA


FE85

E849

4947


FE86

E84A

497A


FE87

E84B

497D


FE88

E84C

4982


FE89

E84D

4983


FE8A

E84E

4985


FE8B

E84F

4986


FE8C

E850

499F


FE8D

E851

499B


FE8E

E852

49B7


FE8F

E853

49B6


FE90

E854

9FBA


FE91

E855

241FE


FE92

E856

4CA3


FE93

E857

4C9F


FE94

E858

4CA0


FE95

E859

4CA1


FE96

E85A

4C77


FE97

E85B

4CA2


FE98

E85C

4D13


FE99

E85D

4D14


FE9A

E85E

4D15


FE9B

E85F

4D16


FE9C

E860

4D17


FE9D

E861

4D18


FE9E

E862

4D19


FE9F

E863

4DAE


FEA0

E864

9FBB