GBK字库 ISO 10646 Unicode UTF8

本文深入探讨了GBK字库与ISO/IEC10646编码标准之间的关系,详细阐述了GBK编码的特点、码位分配、字形规定,以及与GB2312、GB13000.1、BIG-5等编码标准的兼容性。同时,介绍了ISO/IEC10646作为国际编码标准的作用与意义,以及Unicode与ISO/IEC10646的同步发展。本文旨在为读者提供全面了解中文编码标准及其国际标准化进程的知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GBK字库  ISO 10646   Unicode  
GBK字库  ISO 10646  GBK 向下与 GB 2312  编码兼容,向上支持 ISO 10646.1 国际标准,是前者向后者过渡过程中的一个承上启下的标准。ISO 10646 是 国际标准化组织 ISO 公布的一个 编码标准,即 Universal Multilpe-Octet Coded Character Set(简称UCS),大陆译为《通用多八位编码字符集》, 台湾译为《广用多八位元编码字元集》,它与 Unicode 组织的 Unicode 编码完全兼容。ISO 10646.1 是该标准的第一部分《体系结构与基本多文种平面》。我国 1993 年以 GB 13000.1 国家标准的形式予以认可(即 GB 13000.1 等同于 ISO 10646.1)。
GBK编码,是在 GB2312-80标准基础上的 内码扩展规范,使用了双 字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK 编码方案于1995年10月制定, 1995年12月正式发布,目前中文版的 WIN95、WIN98、 WINDOWS NT以及WINDOWS 2000、WINDOWS XP、WIN 7等都支持GBK编码方案。

一、字汇  GBK 规范收录了 ISO 10646.1 中的全部 CJK 汉字和符号,并有所补充。具体包括:
1. GB 2312 中的全部汉字、非汉字符号。
2. GB 13000.1 中的其他 CJK 汉字。以上合计 20902 个 GB 化汉字。
3. 《简化字总表》中未收入 GB 13000.1 的 52 个汉字。
4. 《 康熙字典》及《辞海》中未收入 GB 13000.1 的 28 个部首及重要构件。
5. 13 个汉字结构符。
6. BIG-5 中未被 GB 2312 收入、但存在于 GB 13000.1 中的 139 个图形符号。
7. GB 12345 增补的 6 个拼音符号。
8. 汉字“○”。
9. GB 12345 增补的 19 个竖排标点符号(GB 12345 较 GB 2312 增补竖排标点符号 29 个,其中 10 个未被 GB 13000.1 收入,故 GBK 亦不收)。
10. 从 GB 13000.1 的 CJK 兼容区挑选出的 21 个汉字。
11. GB 13000.1 收入的 31 个 IBM OS/2 专用符号。
12.未录入《 新华字典》上的一些字,如“韡”的简体。
二、码位分配及顺序  GBK 亦采用双 字节表示,总体 编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。
全部 编码分为三大部分:
1. 汉字区。包括:
a. GB 2312 汉字区。即 GBK/2: B0A1-F7FE。收录 GB 2312 汉字 6763 个,按原顺序排列。
b. GB 13000.1 扩充汉字区。包括:
(1) GBK/3: 8140-A0FE。收录 GB 13000.1 中的 CJK 汉字 6080 个。
(2) GBK/4: AA40-FEA0。收录 CJK 汉字和增补的汉字 8160 个。CJK 汉字在前,按 UCS 代码大小排列;增补的汉字(包括部首和构件)在后,按《 康熙字典》的页码/ 字位排列。
2. 图形符号区。包括:
a. GB 2312 非汉字符号区。即 GBK/1: A1A1-A9FE。其中除 GB 2312 的符号外,还有 10 个小写罗马数字和 GB 12345 增补的符号。计符号 717 个。
b. GB 13000.1 扩充非汉字区。即 GBK/5: A840-A9A0。BIG-5 非汉字符号、结构符和“○”排列在此区。计符号 166 个。
3. 用户自定义区:分为(1)(2)(3)三个小区。
(1) AAA1-AFFE,码位 564 个。
(2) F8A1-FEFE,码位 658 个。
(3) A140-A7A0,码位 672 个。
第(3)区尽管对用户开放,但限制使用,因为不排除未来在此区域增补新 字符的可能性。
三、字形  GBK 对字形作了如下的规定:
1. 原则上与 GB 13000.1 G列(即源自 中国大陆法定标准的汉字)下的字形/笔形保持一致。
2. 在 CJK 汉字认同规则的总框架内,对所有的 GBK  编码汉字实施“无重码正形”(“GB 化”);即在不造成重码的前提下,尽量采用 中国新字形。
3. 对于超出 CJK 汉字认同规则的、或认同规则尚未明确规定的汉字,在 GBK 码位上暂安放旧字形。这样,在许多情况下 GBK 收入了同一汉字的新旧两种字形。
4. 非汉字符号的字形,凡 GB 2312 已经包括的,与 GB 2312 保持一致;超出 GB 2312 的部分,与 GB 13000.1 保持一致。
5. 带声调的 拼音字母半角形式。


ISO/IEC 10646 是一个字符集的国际标准编号,全称 Information technology -- Universal Coded Character Set (UCS) ,缩写为UCS。中文常翻译作通用多八位编码字符集。这个标准用于世界上各种语言文字的书面形式的表示、传送、交换、处理、储存、输入和展示,也包含了附加符号 [1]  
为了在电脑及电子装置内处理各地区本身的字符,世界各地采用了不同的编码标准。例如 香港台湾使用 繁体字,通常采用 大五码。中国内地使用 简体字,通常采用 国标码。可惜,各种不同的编码标准互不兼容,一个编码在不同的编码标准内可能代表不同的字符。
当某台电脑上发出的电子资讯传到另一电脑上时,假若两台电脑采用了不同的编码标准,即使通过 转码,也可能会出现 乱码或某些 字符不能正确地显示等问题 [6]  。而制订 ISO/IEC 10646 国际编码标准的目的,便是为了提供一套统一的 字符编码标准,包含世界上所有文字,使电子通讯及资料交换不需 转码,并且可以在一个电脑平台上处理多种语言 文本
采用该标准后,世界各地不同的电脑系统之间便能更准确地储存、处理、传递及显示各种语文的电子资讯,从而加强各地间电子资讯的流通及推动 电子交易的进行。
Unicode 与 ISO/IEC 10646
Unicode与ISO/IEC 10646国际编码标准从内容上来说是同步一致的。在1991年,Unicode学术学会与ISO国际标准化组织决定共同制订一套适用于多种语言 文本的通用编码标准。 Unicode与ISO/IEC 10646国际编码标准于1992年1月正式合作发展一套通用编码标准。自此以后,两个组织便一直紧密合作,同步发展 Unicode及ISO/IEC 10646 国际编码标准 [8]  
Unicode3.0版本与ISO/IEC 10646 国际编码标准所包含的 字符及使用的编码是相同的,包括东亚的 汉字字符。统一码3.0版本已于2000年2月由Unicode联盟正式推出,当中收纳了49,194个来自世界各地不同语言的 字符,其中包含27,484个 汉字字符。此外,国际标准化组织提供 ISO 10646 国际编码标准内的 字符及编码资料,Unicode 学术学会则对这些字符及编码资料提出应用的方法以及语义资料作补充。
在Unicode3.1版已于2001年发表,除了Unicode 3.0 版中的49194个 字符,又增加了44,946个新字符,其中42,711个为 汉字字符。
Unicode 7.0已于2014年6月16日发布,与ISO/IEC 10646:2012标准加上修订版1和修订版2同步,新增2,834个字符 [9]  ,总计112,956个字符,其中汉字字符74,616个 [10]  

UTF-8(8-bit Unicode Transformation Format)是一种针对 Unicode的可变长度 字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个 字节编码UNICODE 字符。用在网页上可以同一页面显示 中文简体繁体及其它语言(如英文,日文,韩文)。



最初,Internet上只有一种字符集——ANSI的ASCII字符集(American Standard Code for Information Interchange, “美国信息交换标准码),它使用7 bits来表示一个字符,总共表示128个字符,后来IBM公司在此基础上进行了扩展,用8bit来表示一个字符,总共可以表示256个字符,充分利用了一个字节所能表达的最大信息

ANSI字符集:ASCII字符集,以及由此派生并兼容的字符集,如:GB2312,正式的名称为MBCS(Multi-Byte Chactacter System,多字节字符系统),通常也称为ANSI字符集。

UNICODE与UTF8,UTF16

由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。因此,产生了Unicode字符集,它固定使用16 bits(两个字节)来表示一个字符,共可以表示65536个字符


标准的Unicode称为UTF-16(UTF:UCS Transformation Format )。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。 (Unicode字符集有多种编码形式)

例如“连通”两个字的Unicode标准编码UTF-16 (big endian(存放时高位在前,低位在后))为:DE 8F 1A 90
而其UTF-8编码为:E8 BF 9E E9 80 9A

当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件一般采用三种方式来决定文本的字符集和编码:
检测文件头标识,提示用户选择,根据一定的规则猜测
最标准的途径是检测文本最开头的几个字节,开头字节 Charset/encoding,如下表:
EF BB BF    UTF-8
FE FF     UTF-16/UCS-2, little endian
FF FE     UTF-16/UCS-2, big endian
FF FE 00 00  UTF-32/UCS-4, little endian.
00 00 FE FF  UTF-32/UCS-4, big-endian.


Unicode:
unicode.org制定的编码机制, 要将全世界常用文字都函括进去.
在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应一个字符; 在2.0开始抛弃了16位限制, 原来的16位作为基本位平面, 另外增加了16个位平面, 相当于20位编码, 编码范围0到0x10FFFF.

UCS:
ISO制定的ISO10646标准所定义的 Universal Character Set, 采用4byte编码.

Unicode与UCS的关系:
ISO与unicode.org是两个不同的组织, 因此最初制定了不同的标准; 但自从unicode2.0开始, unicode采用了与ISO 10646-1相同的字库和字码, ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值, 使得两者保持一致.

UCS的编码方式:


UCS-2, 与unicode的2byte编码基本一样.

UCS-4, 4byte编码, 目前是在UCS-2前加上2个全零的byte.


UTF: Unicode/UCS Transformation Format

UTF-8, 8bit编码, ASCII不作变换, 其他字符做变长编码, 每个字符1-3 byte. 通常作为外码. 有以下优点:
与CPU字节顺序无关, 可以在不同平台之间交流
* 容错能力高, 任何一个字节损坏后, 最多只会导致一个编码码位损失, 不会链锁错误(如GB码错一个字节就会整行乱码)

UTF-16, 16bit编码, 是变长码, 大致相当于20位编码, 值在0到0x10FFFF之间, 基本上就是unicode编码的实现. 它是变长码, 与CPU字序有关, 但因为最省空间, 常作为网络传输的外码.
UTF-16是unicode的preferred encoding.

UTF-32, 仅使用了unicode范围(0到0x10FFFF)的32位编码, 相当于UCS-4的子集.

UTF与unicode的关系:

Unicode是一个字符集, 可以看作为内码.
而UTF是一种编码方式, 它的出现是因为unicode不适宜在某些场合直接传输和处理.
 UTF-16直接就是unicode编码, 没有变换, 但它包含了0x00在编码内, 头256字节码的第一个byte都是0x00, 在操作系统(C语言)中有特殊意义, 会引起问题. 采用UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来一些优点.


 

windows平台,UTF-16LE也被称作unicodeUTF-16BE被称作unicode big endian。这是因为Windows内核使用了UTF-16LE编码。这种叫法并不规范。

unicode编码把一个汉字与一个数字联系在一起。例如“汉”对应的数字是27721,十六进制编码是0x6C49。

如果“字符”是以在Unicode中的序号存在的,那么我们称这种字符串为Unicode字符串或者宽字节字符串。在Unicode中,每个字符都占两个字节。如,"中文123"(占10字节)。

 


UTF是UCS Transformation Format的缩写。它规定了unicode编码的传输格式,即用哪几个字节表示一个unicode编码。同一个unicode编码可以有不同的传输格式。


例如“汉”的编码0x6C49在UTF-8中被映射成E6 B1 89。在UTF-16LE中被映射成49 6C。在UTF-16BE中被映射成6C 49。



 

 

jvm内部,虚拟机管理数据(内存里)时,或者在进行对象序列化的时候,字符(串)都是以unicode编码方式的。

但是在jvm中,字符(串)是以char 这种(存储)形式存放的,一个char2个字节(例如可以定义char c=''),就是“字”和“Z”是同样占2个字节的;而在对象序列化后,对象是进行UTF-8存储的,一个中文占2个字节,而英文、数字等只占一个字节,所以导致系列化以后的对象只占平时的大约一半的空间(当全是中文时占用相同的空间为全是英文时unicode占用的空间是UTF-82倍)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值