UTF-8

UTF-8

目录导航

基本简介

作者:Marius Bancila

字符集简史

UTF-8UTF-8(3)在所有字符集中,最知名的可能要数被称为ASCII的7位字符集了。它是美国标准信息交换代码(American Standard Code for Information Interchange)的缩写,为美国英语通信所设计。它由128个字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)组成。

但是,由于他是针对英语设计的,当处理带有音调标号(形如汉语的拼音)的欧洲文字时就会出现问题。因此,创建出了一些包括255个字符的由ASCII扩展的字符集。其中有一种通常被称为IBM字符集,它把值为128-255之间的字符用于画图和画线,以及一些特殊的欧洲字符。另一种8位字符集是ISO8859-1Latin1,也简称为ISOLatin-1。它把位于128-255之间的字符用于拉丁字母表中特殊语言字符的编码,也因此而得名。欧洲语言不是地球上的唯一语言,因此亚洲和非洲语言并不能被8位字符集所支持。仅汉语字母表(或pictograms)就有80000以上个字符。但是把汉语、日语和越南语的一些相似的字符结合起来,在不同的语言里,使不同的字符代表不同的字,这样只用2个字节就可以编码地球上几乎所有地区的文字。因此,创建了UNICODE编码。它通过增加一个高字节对ISOLatin-1字符集进行扩展,当这些高字节位为0时,低字节就是ISOLatin-1字符。UNICODE支持欧洲、非洲、中东、亚洲(包括统一标准的东亚象形汉字和韩国象形文字)。但是,UNICODE并没有提供对诸如Braille,Cherokee, Ethiopic, Khmer, Mongolian, Hmong, Tai Lu, Tai Mau文字的支持。同时它也不支持如Ahom, Akkadian, Aramaic, BabylonianCuneiform, Balti, Brahmi, Etruscan, Hittite, Javanese, Numidian, Old Persian Cuneiform, Syrian之类的古老文字。

事实证明,对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Universal Transformation Format)。常见的UTF格式有:UTF-7,UTF-7.5,UTF-8,UTF-16,以及UTF-32。

优缺点

优点

UTF-8UTF-8(3)UTF-8编码可以通过屏蔽位和移位操作快速读写。字符串比较时strcmp()和wcscmp()的返回结果相同,因此使排序变得更加容易。字节FF和FE在UTF-8编码中永远不会出现,因此他们可以用来表明UTF-16或UTF-32文本(见BOM)UTF-8是字节顺序无关的。它的字节顺序在所有系统中都是一样的,因此它实际上并不需要BOM。

缺点

你无法从UNICODE字符数判断出UTF-8文本的字节数,因为UTF-8是一种变长编码它需要用2个字节编码那些用扩展ASCII字符集只需1个字节的字符ISOLatin-1是UNICODE的子集,但不是UTF-8的子集8位字符的UTF-8编码会被email网关过滤,因为internet信息最初设计为7位ASCII码。因此产生了UTF-7编码。UTF-8在它的表示中使用值100xxxxx的几率超过50%,而现存的实现如ISO2022,4873,6429,和8859系统,会把它错认为是C1控制码。因此产生了UTF-7.5编码。

字符集

如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节。而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE字符。UTF-8转换表表示如下:

Unicode/UCS-4 bit数 UTF-8 byte数 备注
0000~007F 0~7 0XXXXXXX 1
0080~07FF 8~11 110XXXXX10XXXXXX 2
0800~FFFF 12~16 1110XXXX10XXXXXX10XXXXXX 3 基本定义范围,0~FFFF
10000~1FFFFF 17~21 11110XXX10XXXXXX10XXXXXX10XXXXXX 4 Unicode6,1定义范围,0~10FFFF
200000~3FFFFFF 22~26 111110XX10XXXXXX10XXXXXX10XXXXXX10XXXXXX 5 说明,此非unicode编码范围,属于UCS-4编码早期的规范UTF-8可以到达6字节序列,可以覆盖到31位元(通用字符集原来的极限),尽管如此,2003年11月UTF-8被RFC3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,根据规范,这些字节值将无法出现在合法UTF-8序列中
4000000~7FFFFFFF 27~31 1111110X10XXXXXX10XXXXXX10XXXXXX10XXXXXX10XXXXXX 6

实际表示ASCII字符的UNICODE字符,将会编码成1个字节,并且UTF-8表示与ASCII字符表示是一样的。所有其他的UNICODE字符转化成UTF-8将需要至少2个字节。每个字节由一个换码序列开始。第一个字节由唯一的换码序列,由n位连续的1加一位0组成,首字节连续的1的个数表示字符编码所需的字节数。

Unicode转换为UTF-8时,可以将Unicode二进制从低位往高位取出二进制数字,每次取6位,如上述的二进制就可以分别取出为如下示例所示的格式,前面按格式填补,不足8位用0填补。

注:Unicode转换为UTF-8需要的字节数可以根据Unicode二进制的位数除以6来计算。

示例

UNICODEuCA(11001010)编码成UTF-8将需要2个字节:

uCA->C38A

UNICODEuF03F(1111000000111111)编码成UTF-8将需要3个字节:

uF03F->EF80BF

Unicode16进制 Unicode2进制 bit数 UTF-82进制 UTF-816进制
CA 11001010 8 1100001110001010 C38A
F03F 1111000000111111 16 111011111000000010111111 EF80BF

修正更新

Unicode/UCS-4 bit数 UTF-8 byte数 备注
0000~007F 0~7 0XXXXXXX 1
0080~07FF 8~11 110XXXXX10XXXXXX 2
0800~FFFF 12~16 1110XXXX10XXXXXX10XXXXXX 3 基本定义范围,0~FFFF
10000~1FFFFF 17~21 11110XXX10XXXXXX10XXXXXX10XXXXXX 4 Unicode6,1定义范围,0~10FFFF
200000~3FFFFFF 22~26 111110XX10XXXXXX10XXXXXX10XXXXXX10XXXXXX 5 说明,此非unicode编码范围,属于UCS-4编码早期的规范UTF-8可以到达6字节序列,可以覆盖到31位元(通用字符集原来的极限),尽管如此,2003年11月UTF-8被RFC3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,根据规范,这些字节值将无法出现在合法UTF-8序列中
4000000~7FFFFFFF 27~31 1111110X10XXXXXX10XXXXXX10XXXXXX10XXXXXX10XXXXXX 6

词条图册

Unicode16进制 Unicode2进制 bit数 UTF-82进制 UTF-816进制
CA 11001010 8 1100001110001010 C38A
F03F 1111000000111111 16 111011111000000010111111 EF80BF

相关百科
返回顶部
产品求购 求购