- ASCII: 英文字母与数字编号的一一对应。每个英文字母对应一个编号。范围0~127
- Unicode: 全世界所有语言中字符与数字编号的一一对应。也即为存在的每个字符指定一个唯一的编号。范围为0~0x10FFFF。
所以,
ASCII与Unicode是类似的东西,都是为一个字符指定一个唯一的数字编号
只不过Unicode的范围更大,能够表示更多的字符。
在计算机的世界里,只有数字,而不会有什么字符。一个字符在计算机看来就是一个数字。ASCII与Unicode就是将字符与数字一一对应起来的映射。比如对于字符'A',在计算机看来,它就是一个数字65。
当字符串被写入文件时,也是将字符串中每个字符对应的数字编号保存在文件。
以上是ASCII和Unicode的相同点。那么,二者有什么区别?
一个显著的区别是,对于同一段文本,二者保存到文件后占用的字节数不同。对于ASCII,每个数字编号占用一个字节。 而对于Unicode,每个编号则需要占用3个字节。因此对于同一段文本:'abcd',采用ASCII格式保存时,文件的大小为4个字节。 采用Unicode保存时,文件的大小则为12个字节。
由此也可看出,当待保存文本为纯英文字母时,
采用Unicode的存储效率太低了
UTF8便是为了解决Unicode存储效率低下而产生的。具体的规则就不讲了,先来看一下UTF8能够达到的效果。
对于相同的文本:'abcd',Unicode需要12个字节,而UTF8只需要4个字节(和ASCII一样,达到最优)。
UTF8之所以可以用一个字节存储英文字母,是因此它使用了变长的编码方式。也即,对于英文字母,它采用一个字节保存这个字符。对于英文字母之后的字符,它采用两个字节保存这个字符。对于再之后的字符,采用三个字节保存。最多采用四个字节保存一个字符。
所以UTF8对于存储英文字母的高效率来源于对之后字符保存效率的牺牲。这里的合理性在于:如果待保存的文本中字符大多数为英文字母,则存储效率能够提高,因为大多数字符都是采用一个字节保存。
总结来说,
UTF8是对Unicode在存储效率上的优化
以上便是三者的关系。
ASCII和Unicode都是为一个字符指定一个唯一的数字编号,Unicode能够表达更多的字符,相当于是ASCII的扩展。Unicode存在存储效率低下的问题,UTF8是在这个方面对Unicode的优化。