计算机乱码的问题

2016-02-17 summer 更多博文 » 博客 » GitHub »

encoding

原文链接 http://fee.im/2016/02/encoding/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


我们都知道,任何信息在计算机中都是以二进制01的形式存在,通过不同的01组合,可以表达出不同的信息,这就是编码了。我们通常所说的字节(byte),就是一个最基本的单元,它由8个0或者1来表示,可以组合出256种状态,如果每一种状态代表一个符号,那么一个字节可以编码出256个不同的符号,从00000000到11111111。

计算机最早是美国人在折腾,于是他们捣腾出一套ASCII码表,也就是将一个字节中的0~127种状态分别用来表达数字0~9,大小写英文字母,还有一些标点符号。比如说大写字母A,就是用65来表示,二进制是01000001。这个ASCII表在英文编码中没有什么问题,但是当它流传到欧洲其它国家时就遇到问题了,例如一个法文字母é怎么表示呢?于是他们又捣腾出一个扩展ASCII码表,将剩下的128~255拿来表示其它国家语言的字符。

欧洲国家挺好对付的,他们语言都是各种字母拼起来的嘛,无非就是扩展一下ASCII码表,但是来到中国,ASCII码表就彻底懵逼了,特么你们连茴香豆的茴字都有四种写法。于是就有了GB2312编码,它是用两个字节来表示一个汉字,总共可以表示256*256=65536个汉字,但是GB2312中只收录了6763个简体汉字。就是因为GB2312只收录了简体汉字,所以当它去了香港台湾,同样也懵逼,搞不定繁体汉字,后来将GB2312扩展成了GBK编码,这样里面包括了简体繁体,以及一些少数民族的文字。

中文的问题解决了,还有韩文、日文、阿拉伯文以及世界上那么多种文字,能不能有个终极解决方案啊!答案就是Unicode,Unicode是一个字符集,目前它收录了120737个字符,包括了各个国家的文字、符号以及一些表情,比如,U+0041表示英语的大写字母A,U+4E0A表示汉字”上”。

那么UTF-8、UTF-16和UTF-32又是什么鬼?其实它们都是Unicode字符集的不同编码方式。UTF-8是一种变长的编码,可以用1-4个字节来表示一个字符,如果一个字符在Unicode中越靠后,那么它需要的字节就越多。UTF-16是以两个字节或者四个字节来表示一个字符,而UTF-32就是始终都以4个字节来表达一个字符。与UTF-8相比,UTF-16和UTF-32就不是那么环保了,所以目前互联网上最流行的字符编码就是UTF-8了。