UTF8是一种储存和传送的格式。
UTF8是以8bits即1Bytes为编码的最基本单位,也可以基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前使用不多,而UTF8则被广泛应用在文件储存和网络传输中。
编码原理
先看这个模板:
UCS-4 range (hex.) UTF-8
octet sequence (binary)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-001F FFFF 11110xxx
10xxxxxx 10xxxxxx 10xxxxxx
0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx
编码步骤:
1) 首先确定需要多少个8bits(octets)
2) 按照上述模板填充每个octets的高位bits
3) 把字符的bits填充至x中,字符顺序:低位→高位,UTF8顺序:最后一个octet的最末位x→第一个octet最高位x
4) 解码的原理一样。
实例:(留意每个bit的颜色,粗体字为模板内容)
UCS-4 UTF-8
HEX BIN Bytes BIN HEX Bytes
0000 000A 00001010 4 00001010 0A 1
0000 0099 10011001 4 11000010 10011001 C2 99 2
0000 8D99 10001101 10011001 4 11101000 10110110 10011001 E8 B6 99 3
以UTF8格式储存的文件档首标识为EF
BB BF。
效率
从上述编码原理中得可以得以下结论:
1.每个英文字母、数字所占用空间为1 Byte。
2.汉字占3
Bytes。
而直接使用无论是ANSI还是Unicode/UCS2来编码,中文都只占用2字节。所以UTF8对英文来说是个非常好的方案,但对中文来说并不是一个好的选择。
也就是说,英文编码一般用UTF8,中文使用的是GB18030
Unicode:
unicode.org制定的编码机制, 要将全世界常用文字都函括进去.
在1.0中是16位编码,
由U+0000到U+FFFF.
每个2byte码对应一个字符;
在2.0开始抛弃了16位限制,
原来的16位作为基本位平面,
另外增加了16个位平面,
相当于20位编码,
编码范围0到0x10FFFF.
UCS:
ISO制定的ISO10646标准所定义的
Universal Character Set, 采用4byte编码.
Unicode与UCS的关系:
ISO与unicode.org是两个不同的组织,
因此最初制定了不同的标准; 但自从unicode2.0开始,
unicode采用了与ISO 10646-1相同的字库和字码,
ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值,
使得两者保持一致.
UCS的编码方式:
UCS-2, 与unicode的2byte编码基本一样.
UCS-4, 4byte编码, 目前是在UCS-2前加上2个全零的byte.
UTF:
Unicode/UCS Transformation Format
UTF-8, 8bit编码, ASCII不作变换,
其他字符做变长编码, 每个字符1-3 byte. 通常作为外码.
有以下优点:
* 与CPU字节顺序无关,
可以在不同平台之间交流
* 容错能力高,
任何一个字节损坏后, 最多只会导致一个编码码位损失, 不会链锁错误(如GB码错一个字节就会整行乱码)
UTF-16, 16bit编码, 是变长码,
大致相当于20位编码,
值在0到0x10FFFF之间,
基本上就是unicode编码的实现.
它是变长码,
与CPU字序有关,
但因为最省空间,
常作为网络传输的外码.
UTF-16是unicode的preferred
encoding.
UTF-32, 仅使用了unicode范围(0到0x10FFFF)的32位编码,
相当于UCS-4的子集.
UTF与unicode的关系:
Unicode是一个字符集, 可以看作为内码.
而UTF是一种编码方式,
它的出现是因为unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码,
没有变换,
但它包含了0x00在编码内,
头256字节码的第一个byte都是0x00,
在操作系统(C语言)中有特殊意义,
会引起问题.
采用UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来一些优点.
中国国标编码:
GB 13000: 完全等同于ISO 10646-1/Unicode 2.1, 今后也将随ISO
10646/Unicode的标准更改而同步更改.
GBK: 对GB2312的扩充,
以容纳GB2312字符集范围以外的Unicode
2.1的统一汉字部分, 并且增加了部分unicode中没有的字符.
GB 18030-2000: 基于GB 13000, 作为Unicode
3.0的GBK扩展版本,
覆盖了所有unicode编码,
地位等同于UTF-8,
UTF-16, 是一种unicode编码形式.
变长编码,
用单字节/双字节/4字节对字符编码.
GB18030向下兼容GB2312/GBK.
GB 18030是中国所有非手持/嵌入式计算机系统的强制实施标准.