耐人寻味:UTF-8的优缺点

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以加大东方字符的存储空间为代价,节省了西方字符的存储空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金创想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值