Chinaunix首页 | 论坛 | 博客
  • 博客访问: 572357
  • 博文数量: 185
  • 博客积分: 4031
  • 博客等级: 上校
  • 技术积分: 1591
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-27 19:45
文章分类

全部博文(185)

文章存档

2011年(14)

2010年(63)

2009年(108)

我的朋友

分类:

2010-08-29 12:03:03

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。它们是:

那么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
”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

 

阅读(824) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~