常用字符集介绍和编码转换原理目录1. GB2312编码介绍 (2)1.1 基本信息 (2)1.2 GB标准 (2)1.3 分区表示 (2)1.4 字节结构 (2)2. 通用字符集UCS (3)2.1 定义 (3)2.2 概要 (3)2.3 实现级别 (3)2.4 与UNICODE的兼容关系 (3)3. unicode编码介绍 (3)3.1 基本简介 (4)3.2 编码实现 (4)3.2.1 编码方式 (4)3.2.2 实现方式 (5)4. UTF-8介绍 (5)4.1 基本介绍 (5)4.2 编码原理 (5)4. 转换原理 (7)1. GB2312编码介绍1.1 基本信息1.2 GB标准GB2312或GB2312-80是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集·基本集》,又称为GB0,由中国国家标准总局发布,1981年5月1日实施。
GB2312编码通行于中国大陆;新加坡等地也采用此编码。
中国大陆几乎所有的中文系统和国际化的软件都支持GB2312。
GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。
GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。
对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。
1.3 分区表示GB 2312中对所收汉字进行了―分区‖处理,每区含有94个汉字/符号。
这种表示方式也称为区位码。
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。
举例来说,―啊‖字是GB2312之中的第一个汉字,它的区位码就是1601。
1.4 字节结构2. 通用字符集UCS2.1 定义2.2 概要通用字符集是所有包括了其他字符集。
它保证了与其他字符集的双向兼容,即,如果你将任何文本字符串翻译到UCS格式,然后再翻译回原编码,你不会丢失任何信息。
UCS包含了已知语言的所有字符。
除了拉丁语、希腊语、斯拉夫语、希伯来语、阿拉伯语、亚美尼亚语、乔治亚语,还包括中文、日文、韩文这样的象形文字,UCS还包括大量的图形、印刷、数学、科学符号。
ISO 10646定义了一个31位的字符集。
ISO 10646-1标准第一次发表于1993年,现在的公开版本是ISO/IEC 10646-1:2000。
ISO 10646-2在2001年发表。
UCS不仅给每个字符分配一个代码,而且赋予了一个正式的名字。
表示一个UCS或Unicode值的十六进制数通常在前面加上―U+‖,例如―U+0041‖代表字符―A‖。
2.3 实现级别并不是所有的系统都需要支持像组合字符这样的的先进机制。
因此ISO 10646指定了如下三种实现级别:级别1:不支持组合字符和谚文字母字符。
级别2:类似于级别1,但在某些文字中,允许一列固定的组合字符,因为如果没有最起码的几个组合字符,UCS就不能完整地表达这些语言。
级别3:支持所有的通用字符集字符,如,可以在任意一个字符上加上一个箭头或一个鼻音化符号.2.4 与UNICODE的兼容关系通用字符集是与UNICODE同类的组织,UCS-2和UNICODE兼容。
位数:它有UCS-2和UCS-4两种格式,分别是2字节和4字节。
范围:UCS-4只是在UCS-2前面加了0×0000。
3. unicode编码介绍Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。
它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
1990年开始研发,1994年正式公布。
随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。
备注:统一码联盟(英语:The Unicode Consortium)是一个致力于开发,维护,发展全球通用软件标准和数据格式,特别是维护Unicode编码标准的非牟利机构。
3.1 基本简介Unicode 是基于通用字符集(Universal Character Set)的标准来发展,并且同时也以书本的形式(The Unicode Standard,目前第五版由Addison-Wesley Professional出版,ISBN-10: 0321480910)对外发表。
2006年7月的最新版本的Unicode 是5.0版本。
2005年3月31日推出的Unicode 4.1.0 。
另外,5.0 Beta 于2005年12月12日推出,5.2版本(unicode standard)于2009年10月1日正式推出,以供各会员评价。
目前Unicode标准,6.1版已发布(2012年1月31日)。
在unicode联盟网站上可以查看完整的6.1的核心规范。
Unicode定义了大到足以代表人类所有可读字符的字符集。
Java语言就用到了Unicode编码,从而实现了该语言的国际通用性。
3.2 编码实现3.2.1 编码方式Unicode是国际组织统一码联盟制定的可以容纳世界上所有文字和符号的字符编码方案。
Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位(码位就是可以分配给字符的数字)。
UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
拓展了解:通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。
UCS-2用两个字节编码,UCS-4用4个字节编码。
历史上存在两个独立的尝试创立单一字符集的组织,即国际标准化组织(ISO)和多语言软件制造商组成的统一码联盟。
前者开发的ISO/IEC 10646 项目,后者开发的统一码项目。
因此最初制定了不同的标准。
1991年前后,两个项目的参与者都认识到,世界不需要两个不兼容的字符集。
于是,它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。
从Unicode 2.0开始,Unicode采用了与ISO 10646-1相同的字库和字码;ISO也承诺,ISO 10646将不会替超出U+10FFFF的UCS-4编码赋值,以使得两者保持一致。
两个项目仍都存在,并独立地公布各自的标准。
但统一码联盟和ISO/IEC JTC1/SC2都同意保持两者标准的码表兼容,并紧密地共同调整任何未来的扩展。
在发布的时候,Unicode一般都会采用有关字码最常见的字型,但ISO 10646一般都尽可能采用Century字型。
UCS-4根据最高位为0的最高字节分成2^7=128个group。
每个group再根据次高字节分为256个平面(plane)。
每个平面根据第3个字节分为256行(row),每行有256个码位(cell)。
group 0的平面0被称作BMP(Basic Multilingual Plane)。
将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。
每个平面有2^16=65536个码位。
Unicode计划使用了17个平面,一共有17*65536=1114112个码位。
在Unicode 5.0.0版本中,已定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16。
其中平面15和平面16上只是定义了两个各占65534个码位的专用区(Private Use Area),分别是0xF0000-0xFFFFD和0x100000-0x10FFFD。
所谓专用区,就是保留给大家放自定义字符的区域,可以简写为PUA。
平面0也有一个专用区:0xE000-0xF8FF,有6400个码位。
平面0的0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域。
代理区的目的用两个UTF-16字符表示BMP以外的字符。
在介绍UTF-16编码时会介绍。
如前所述在Unicode 5.0.0版本中,238605-65534*2-6400-2048=99089。
余下的99089个已定义码位分布在平面0、平面1、平面2和平面14上,它们对应着Unicode目前定义的99089个字符,其中包括71226个汉字。
平面0、平面1、平面2和平面14上分别定义了52080、3419、43253和337个字符。
平面2的43253个字符都是汉字。
平面0上定义了27973个汉字。
3.2.2 实现方式在Unicode中:汉字―字‖对应的数字是23383。
在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。
UTF是―UCS Transformation Format‖的缩写,可以翻译成Unicode 字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。
例如,―汉字‖对应的数字是0x6c49和0x5b57,而编码的程序数据是:BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8编码WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16编码DWORD data_utf32[] = {0x6c49, 0x5b57}; // UTF-32编码这里用BYTE、WORD、DWORD分别表示无符号8位整数,无符号16位整数和无符号32位整数。
UTF-8、UTF-16、UTF-32分别以BYTE、WORD、DWORD作为编码单位。
―汉字‖的UTF-8编码需要6个字节。
―汉字‖的UTF-16编码需要两个WORD,大小是4个字节。
―汉字‖的UTF-32编码需要两个DWORD,大小是8个字节。
根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。
下面介绍UTF-8、UTF-16、UTF-32、字节序和BOM。
4. UTF介绍4.1 基本介绍事实证明,对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。
为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Universal Transformation Format)。