说到编码,得先从ASCII编码讲起。ASCII编码是由美国人发明,美国的字符不超过255个,所以ASCII编码使用了8bit 即一个字节来存储字符。由于汉字的数量远超255个,所以中国自己发明了一个GB2312编码来表示汉字,一般的汉字使用2个字节,对于一些生僻的汉字则使用更多的字节来表示,当然,GB2313编码是可以兼容ASCII码的。
然后,日本,韩国等等国家也自己发明了一套编码方法,这时候又出现了一个新的问题。如果一篇文章里面,即有中文,又有日文的话,无论使用中文的编码方法还是使用日文的编码方法都会出现乱码。随后,unicode编码便应运而生。unicode编码对文字的编码进行了统一,当然,unicode只是一种编码规范,它有多个版本,常用的unicode编码使用了16位来存储字符,16位的存储空间足以容纳世界上所有书面字符(对于汉字来说,一共有6万多个,只能包含其中的一些常用汉字,所以unicode编码对于汉字的兼容性并不是特别好)。unicode编码兼容了ASCII码,ASCII码转unicode编码时,保持后8位不变,前8位只需要用0去补全即可。
使用了unicode编码后,又有新的问题出现。因为unicode编码是用两个字节来存储字符,如果一篇文章中,大部分都是英文,使用unicode编码就会造成空间的浪费,对英文部分使用ASCII码只需要一个字节就可以了。这时候,utf-8解决了这个问题。utf-8是一种可变长的字符编码,当存储英文时只使用一个字节,节省了一半的空间,而存储中文字符时,长度还是不变。utf-8虽然压缩了存储空间,但是如果在内存中存储,使用utf-8却由于它的长度不固定,带来了很大的不便,使得在内存处理字符变得复杂。应对这个问题的解决策略是:在内存中存储字符时还是使用unicode编码,因为unicode编码的长度固定,处理起来很方便。而在文件的存储中,则使用utf-8编码,可以压缩内存,节省空间。这里一般有个自动转换的机制,即从文件中读取utf-8编码到内存时,会自动转换为unicode编码,而从内存中将字符保存到文件时,则自动转换为utf-8编码。
网友评论