Unicode 字符集与它的编码方式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编码字符集:编码字符集是一个字符集,它为每一个字符分配一个唯一数字。Unicode 标准的核心是一个编码字符集,字母“A”的编码为004116 和字符的编码为20AC16。Unicode 标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,所以“A”的编码书写为“U+0041”。

1 ASCII码

我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。

ASCII码一共规定了128个字符的编码(准确地说ASCII码是一个编码字符集),比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。后128个称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展ASCII码。

256个ASCII码中的后128个扩展码可定制用来表示特殊字符和非英语字符,GB2312就是利用这后面的128个扩展字符来表示汉字,[161,254]共94个字符来组成双字节来表示简体汉字字符表。

2 Unicode编码字符集

光是英语字符ASCII编码字符集是够了,但是如果算上世界上其他的语言的字符,ASCII 码显然不够了,于是Unicode编码字符集应运而生。

Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

3 UTF-8

Unicode编码字符集只是统一定义了所有字符和它对应Unicode编码值,而我们的程序中怎么去存储和读取这个Unicode编码值呢?显然,你可以直接统一规定所有Unicode编码值用四个字节来存储。但是这样的话,对于Unicode编码字符集中的与ASCII码表对应的那部分字符(只需要一个字节来表示的Unicode编码值)就有点浪费了。这样,utf-8也就粉墨登场了。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

Unicode符号范围| UTF-8编码方式

(十六进制) | (二进制)

--------------------+---------------------------------------------

0000 0000 ~ 0000 007F | 0xxxxxxx--------7bit

0000 0080 ~ 0000 07FF | 110xxxxx10xxxxxx -------11bit

0000 0800 ~ 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx -----16bit

0001 0000 ~ 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx ----21bit

UTF-8编码规则:

1> 对于Unicode编码值的二进制位数小于等于7的情况,用一个字节来表示这个Unicode 编码值,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2> 对于Unicode编码值的二进制位数大于等于8并且小于等于11的情况,用两个字节来表示,第一个字节的前两位都设为1,第两+1位设为0,第二个字节的前两位设为10。剩下的没有提及的二进制位,全部填充这个符号对应的unicode码。

3> 以此类推,对于需要n个utf-8 字节来表示的的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部填充这个符号对应的unicode码。

utf-8编码长度最大为四个字节,所以最多只能表示Unicode编码值的二进制数为21位的Unicode字符。

4. UTF-16

16进制编码范围UTF-16表示方法(二进制)10进制码范围字节数量

U+0000---U+FFFF xxxxxxxx xxxxxxxx 0-65535 2

U+10000---U+10FFFF 110110yyyyyyyyyy 110111xxxxxxxxxx 65536-1114111 4

UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节(2字节)储存----0号平面(包含所有基本的字符)都在此表示范围,但UTF-16却无法相容于ASCII编码.

UTF-16编码以16位无符号整数为单位。我们把Unicode 编码记作U。编码规则如下:

如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数(为书写简便,下文将16位无符号整数记作WORD)。

如果U≥0x10000,我们先计算U'=U-0x10000,然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。

为什么U'可以被写成20个二进制位?Unicode的最大码位是0x10ffff,减去0x10000后,U'的最大值是0xfffff,所以肯定可以用20个二进制位表示。例如:Unicode编码0x20C30,减去0x10000后,得到0x10C30,写成二进制是:0001 0000 1100 0011 0000。用前10位依次替代模板中的y,用后10位依次替代模板中的x,就得到:1101100001000011 1101110000110000,即0xD843 0xDC30。

按照上述规则,Unicode编码0x10000-0x10FFFF的UTF-16编码有两个WORD,第一个WORD的高6位是110110,第二个WORD的高6位是110111。可见,第一个WORD 的取值范围(二进制)是11011000 00000000到11011011 11111111,即0xD800-0xDBFF。第二个WORD的取值范围(二进制)是11011100 00000000到11011111 11111111,即0xDC00-0xDFFF。

为了将一个WORD的UTF-16编码与两个WORD的UTF-16编码区分开来,Unicode 编码的设计者将0xD800-0xDFFF保留下来,并称为代理区(Surrogate):

D800-DB7F║High Surrogates║高位替代

DB80-DBFF║High Private Use Surrogates║高位专用替代

DC00-DFFF║Low Surrogates║低位替代

相关文档
最新文档