UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码,又称万国码。由Ken Thompson于1992年创建。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。
缺点
你无法从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 |