Unicode的编码方式有三种:UTF-8、UTF-16、UTF-32,为什么只有UTF-8成为最耀眼的明星了呢?
首先说这三种编码的区别,8、16、32可看作每种编码存储字符所需的最少的位数。光从占用存储空间这一指标看,UTF-16、UTF-32就注定干不过UTF-8了。
下面具体说说UTF-8的优缺点:
一、优点:
(1)全球通用。
背靠拥有世界统治力的老爸Unicode,可以让全球文字和谐共舞,彻底避免乱码问题。像中国出品的GB2312、GBK就只能跟英日韩私聊,无法与全世界沟通。
(2)节省空间。
节省西方字符的存储空间,以加大东方字符的存储空间为代价。英文字符只占1个字节,东方字符普遍3个字节以上。
(3)字节序无关。
字节序在所有系统中都是一样的,因此它实际上并不需要BOM(Byte Order Mark)。
所谓的字节序是指一个字符表示为多个字节时,各字节在内存中的先后顺序。字节序主要有两种: 大端字节序(Big-Endian)、小端字节序(Little-Endian)。前者指最高字节存放在最低的内存地址,最低字节存放在最高的内存地址,后者正相反。
UTF-8编码字节序无关,就是说这种编码不受字节序的影响。比如“中”字有3个字节,这三个字节在内存中的无论采用哪种字节序都可以正确识别,不用单独在文件中标识出字节序。然而,这是有代价的,后面说缺点时会说。
(4)兼容性高。
完全兼容ASCII编码,因而在只支持ASCII编码老系统也可以用。
二、缺点:
(1)性能损失。
不能直接按字节划分边界,性能有一定损失。
因为UTF-8采用的是不定长的编码方式,故无法从UNICODE字符数判断出UTF-8的字节数。如果直接通过字节来分割边界,可能会产生公公般的“净身”效果。
当然,人家能设计出这套系统,必然有办法解决此问题,不过效率一定是低于直接按字节来区分字符的,当处理的数据量很大时,性能上就会受到影响。不过在如今的变态硬件面前,这些性能损失也已不足道哉了。
(2)增加了多字节字符的存储空间。
前面说的UTF-8“字节序无关”这一魔法的原理很简单,更准确地说应该是很无脑,因为每个字节的存储的内容都包含了两部分信息:字符的字节信息、字符本身信息。
字节的前面几位保存的是字符的字节信息,比如这个字符是单字节还是多字节(字节第1位是0单表单字节)、由几个字节组成(由几个字节组成字节的前面几位就都是1)等;后面几位保存的才是字符本身的信息。
由于字节信息的存在,当系统读取UTF-8编码的文本文件时,它会根据每个字节的起始位来判断该字节是单字节字符的一部分,还是多字节字符的起始字节、中间字节或结尾字节。
可见,UTF-8是在字节中存储了字节序信息,而不是根本用不到字节序。
由于ASCII码128个字符第一位本来就是0,所以没有任何影响。相反,对于多字节字符而言,就无端生出很多只表示字节信息的位,这显然是一种大大的浪费。
所以,老金才在前面的优点中说,UTF-8以加大东方字符的存储空间为代价,节省了西方字符的存储空间。