我们知道ASCII码表中总共只有值在0-127之间的128个字符,用其表示纯粹的英文字符等已经足够了,而正是基于此产生了ANSI字符集。ANSI字符集中每个字符都是以一个8位的字节表示,但是后来随着全球信息化的加强,各国的语言都需要得到相应的体现,于是就出现了宽字符集,再后来就出现了unicode字符集,unicode又有UCS-2 和 UCS-4两种标准,不过通常unicode字符集中每个字符用两个字节来表示,这种表示方法就能囊括目前各国的语言字符,并且能有扩展的空间。而UTF8更是对传统的unicode等长字符表示方式的一种改进,它采用的较为灵活的变长方式,这样能够在概率上做到空间上的节省。下面是UTF8的原理说明。
UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。值得强调的是,UTF-8只是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
当要表示的内容是 7位 的时候就用一个字节:0******* 第一个0为标志位,剩下的空间正好可以表示ASCII 0-127 的内容。
当要表示的内容在 8 到 11 位的时候就用两个字节:110***** 10****** 第一个字节的110和第二个字节的10为标志位。
当要表示的内容在 12 到 16 位的时候就用三个字节:1110***** 10****** 10****** 和上面一样,第一个字节的1110和第二、三个字节的10都是标志位,剩下的所有*的位置都应该根据实际数据加以填充有效数据。
以此类推:
四个字节:11110**** 10****** 10****** 10******
五个字节:111110*** 10****** 10****** 10****** 10******
六个字节:1111110** 10****** 10****** 10****** 10****** 10******
下面的参考文章出自http://blog.youkuaiyun.com/xiongchen/archive/2006/04/10/657068.aspx,我觉得总结的很好,尤其是这里有关于Surrogate Pair 的说明,特粘贴至此:
一、
Unicode发展历史
字符必须经过编码以后才能被计算机处理,计算机使用的默认编码方式称为计算机的内码。早期的计算机使用7位的ASCII编码作为内码,但ASCII编码只能处理2^7=128个字符(包括英文字母、数字、符号、控制字符等),但是世界上有着成百上千种的语言,仅仅用ASCII是无法进行处理的。因此,世界各国开始纷纷研究处理本国语言的方法。在中国为了处理汉字,程序员设计了用于简体中文的GB2312编码和用于繁体中文的big5编码。
中国各种编码标准的情况:
1980年公布的GB2312编码标准一共收录了7445个字符,包括6763个汉字和682个其它符号。
GB2312 支持的汉字太少。1995年公布的汉字扩展规范GBK1.0则收录了21886个符号,它分为汉字区和图形符号区,汉字区包括21003个字符。
2000年发布的GB18030正式取代GBK1.0成为国家标准,该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,所以现在的PC平台必须支持GB18030标准。
光是在中国就有那么多种不同的编码方式,世界各国编码方式的混乱情况就可想而知了。于是人们开始寻求一种统一的标准编码方法来表示和处理世界上绝大多的语言,众多的编码方法中最后只有Unicode编码最终成为了事实标准。
Unicode字符集编码是(Universal Multiple-Octet Coded Character Set) 通用多八位编码字符集的简称,支持世界上超过650种语言的国际字符集。它是由一个名为 Unicode 协会(Unicode Consortium)的机构制订的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理及显示。该编码于1990年开始研发,1994年正式公布,最新版本是2005年3月31日的Unicode 4.1.0,Unicode协会的官方网站是http://www.unicode.org,上面有关于Unicode的最新消息与最权威的资料。
二、
Unicode
编码术语解释
UCS:Universal Multiple-Octet Coded Character Set(通用多八位编码字符集)的字符集,也可以以看作是"Unicode Character Set"的缩写。有UCS-2和UCS-4两种不同的实现方法,UCS-2采用两个字节进行编码,而UCS-4采用4个字节(实际上只用了31位,最高位必须为0)进行编码。
UTF编码:即UCS Transformation Format(UCS转换格式),它是将Unicode编码规则和计算机的实际编码对应起来的一个规则,用于网络传输、编码转换等。
Little Endian/Big Endian:字节序,也就是处理多字节时采用的顺序,例如:“南”字的Unicode编码是5357,字节序将决定它写到文件里时,是53在前还是57在前,如果是Big Endian则写为5357,反之则是5753。
三、
Unicode编码中的数学
1、
UCS-2使用2个字节,即16位来编码,所以共可以表示
216=65536
个码元;
UCS-4
使用
4
个字节,即
32
位来编码,但最高位必须为
0
,所以共可以表示
231=2147483648
个码元。
2、UCS-4码元的管理:由于UCS-4表示的码元非常大,所以需要采用一种机制来管理这些码元。UCS-4先根据最高字节不同分为27=128个群组,再根据第二个字节不同分为28=256个平面,然后根据第三个字节不同分为28=256行,最后根据第四个字节不同分为每行分为256个单元。也就是说同一行的不同单元只是最后一个字节不同,其余都相同。
3、UCS-4编码中,群号为0,平面号为0的所有码元称之为BMP,即Basic Multilingual Plane(基础多语言平面)。
4、将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。
这些数据和关系可以由下图清楚的得到: