`
liudaoru
  • 浏览: 1576186 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Unicode、GB2312、GBK和GB18030中的汉字[转]

    博客分类:
  • Ajax
阅读更多

From: http://blog.csdn.net/fmddlmyy/archive/2007/11/05/1868313.aspx

 

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
CJK统一汉字区新增了这8个字符 0x9FB4-0x9FBB
未计入 CJK统一汉字区新增的14个字符 0x9FA6-0x9FB3

因为GB18030映射了Unicode的所有码位,所以CJK统一汉字区新增的0x9FA6-0x9FB3这14个字符在GB18030中都有对应的码位。不过GB18030没有明确收录这些字符。

附录1 GB18030的汉字编码表

我整理了GB18030的汉字编码表,需要的朋友可以下载。以下是其中的简要说明:

简要说明
将表1(21003)和表2(6530)合起来就是GB18030-2000要求的27533个汉字
将表1(21003)、表2(6530)和表3(42711)合起来就是GB18030-2005要求的70244个汉字
Unicode的扩充A本来有6582个汉字,因为GB18030的双字节区已经收录过Unicode扩充A的52个汉字,所以GB18030四字节区扩充A只有6530个汉字。表4列出了这52个汉字。
GBK增补的80个字符本来是放在PUA区的。后来又被Unicode收录。所以既可以用PUA区的编码表示,也可以用非PUA编码表示。如下表所示。
 

分享到:
评论
2 楼 liudaoru 2010-05-27  
aaxron 写道
正需要,
特来感谢.

:)
1 楼 aaxron 2010-05-26  
正需要,
特来感谢.

相关推荐

    unicode与GB18030(GB2312,GBK) 转换码表

    GBK是在GB2312基础上的扩展,增加了对GBK18030之前其他编码系统的兼容,包括BIG5(用于繁体中文)和GB2312不涵盖的一些少数民族文字,共收录了20902个汉字和符号,是GB2312的一个广泛使用的扩展版本。 转换码表是...

    GB2312简体中文编码表及转换程序

    "汉字编码表.txt"和"Unicode、GB2312、GBK和GB18030中的汉字_janvyking999的空间_百度空间.txt"这两个文本文件可能包含了汉字在不同编码中的对应信息,供开发者参考和使用。 在实际开发中,理解和掌握这些编码标准...

    C# GB2312转成Unicode

    GB2312,全称“汉字国标交换码”,是中国大陆的国家标准汉字编码,主要用来表示简体中文。它包含6763个常用汉字和682个非汉字图形符号,适用于一般中文信息处理和交换。 然而,Unity Web Player作为一个基于Web的...

    常见汉字的Unicode和GB2312映射表

    在开发stm32时,从网上接收到utf8的数据流中包含汉字,如果要正确的在串口中打印汉字的话,就要把utf8(一个汉字3字节)转为GB2312(一个汉字2字节),这个过程不能直接转化,因为GB2312只有和16位的Unicode有映射,...

    gb18030与unicode转换表

    总的来说,GB18030与Unicode转换表是跨平台、跨语言数据交换的重要工具,理解并掌握其工作原理和使用方法,对于IT从业人员来说具有重要意义,特别是在处理中文字符集的项目中。通过深入学习和应用这个转换表,我们...

    unicode转gb18030编码

    总结,理解和应用“unicode转gb18030编码”的知识,不仅可以帮助你在处理多语言文本时避免乱码问题,还能增进对字符编码系统和编程语言底层机制的理解。通过研究提供的C语言实现,你将能够深入掌握这些技术,并应用...

    Unicode转换成GBK

    2. **GBK**:GBK(GB2312扩展)是中国大陆制定的一种汉字编码标准,用于支持简体中文环境下的文字处理。它是在GB2312基础上进行扩展的,包含了更多的汉字和符号。GBK编码通常使用双字节表示一个字符。 #### 三、...

    Unicode to GB2312 or GBK table

    在表中,星号(*)标记的字符是只在GBK编码中定义的字符,表示这个字符在GB2312中没有对应。比如,U+0020表示空格,而“a1e3±”则对应于GBK中的字符±。另外,“a8b5)”表示GBK中的字符“ǖ”。 需要注意的是,由于...

    unicode转gb18030的c代码

    总结来说,从"unicode转gb18030的c代码"这个主题中,我们可以学习到字符编码的基础知识,了解Unicode和GB18030的区别,掌握C语言实现编码转换的方法,以及如何处理跨平台的兼容性问题。这对于开发涉及多语言环境的...

    GB18030编码研究以及GBK,GB2312,GB18030与Unicode的映射,乱码解决

    - **编码演变**:从GB2312到GBK再到GB18030,可以看出汉字编码标准随着技术进步和社会需求的发展不断扩展和完善。GB18030作为最新且最全面的标准,不仅支持了大量的汉字和图形符号,还考虑了与国际标准Unicode的兼容...

    编码转换器 绿色版 gb2312 gbk utf-8

    标题和描述中提到的"编码转换器 绿色版 gb2312 gbk utf-8 万能转换"是一个软件工具,它能够帮助用户将文本文件从一种编码格式转换到另一种,尤其是GB2312、GBK和UTF-8这三种常见的中文编码格式。 1. **编码系统**:...

    unicode转gb2312对比数组

    3. 如果Unicode字符不在GB2312的范围内,则可能无法直接转换,需要使用扩展的GBK或GB18030编码。 4. 获取到对应的两个字节,形成GB2312编码。 文件`gb2uni.h`可能包含了这样的转换对照表,其中可能定义了从GB2312到...

    GBK.rar_GB2312-80_GBK_gb2312_gb2312-To-unicode_汉字编码

    GBK兼容GB2312,不仅包含GB2312中的所有汉字,还增加了包括繁体字、少数民族文字、符号等在内的20902个字符,总计20480个不同的编码位置,大大扩展了汉字的表示范围,为中文信息处理提供了更广阔的空间。 在“GBK_...

    gb18030与unicode的映射表

    GB18030,全称是《信息技术 中文编码扩展规范》,是中国国家标准,旨在扩大GB2312和GBK编码的覆盖范围,以支持更多的汉字和其他中文字符。GB18030编码标准包含了大约27,500多个汉字,包括简体和繁体,以及一些少数...

    国标一二级汉字字符集:GB2312、GBK

    例如,在GB2312中,低位字节的范围通常是A1到FE,在GBK中则是A1到F7。每个汉字或符号在字符集中都对应着一个唯一的机内码。 字符集的使用涉及到字符的存储和编码,以确保计算机系统能够识别和处理汉字信息。无论是...

    GBK码表 GB18030码表 汉字编码

    GB18030是正式国家标准,是GBK或GB2312的超集。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。 这里是一个Excle版本的码表,罗列出码元及对应的GBK编码和Unicode编码,是研究编码的...

    Unicode与GB2312互转.zip

    如果不在范围内,可能需要采用其他方法(如使用GBK或GB18030等更广泛的中文编码)。 3. **编码**:将码点转换为目标编码的字节序列。例如,将Unicode码点转换为GB2312的双字节格式,或者反之。 转换过程中需要注意...

    gb2312转Unicode编码

    GB2312是GBK编码的前身,而GBK又进一步扩展了GB2312,兼容了更多的汉字和字符。 相比之下,Unicode是一种国际标准,旨在包含世界上所有语言的字符,它使用统一的编码体系,避免了不同编码系统间的不兼容问题。...

Global site tag (gtag.js) - Google Analytics