简洁就是美。把问题说得简单、易懂是一种美德。


我们用浏览器上网的时候会接触到“编码”这个概念,我们都知道“乱码”这样事情,有时候浏览网站看到的就是乱码,一堆混乱的文字,没有含义,不能解读。
那么什么是编码,怎么会有乱码产生呢?

编码,英语是Character Encoding。我们人类能看懂的是字符,就是Character。字符要在计算机系统里面存储、传输,要以二进制数字的形式。每一种编码就是一种字符和二进制数字之间有个对应关系或者说映射关系。

GB2312和UTF-8都是互联网上常用的字符编码。
举个例子,“王”字在GB2312编码方式下对应的二进制数字是11001101 11110101(CD F5),是两个8位二进制数,两个字节。你可以这样想像,所谓字符编码就是把字符跟二进制数字关联起来的一种关联关系。在GB2312下,“王”是CD F5,“亡”是CD F6,“枉”是CD F7,“网”是CD F8,以此类推。。。可以有趣地发现,在GB2312编码里,这几个连在一起的字符都是wang音,接下去从CD F9到CD FD是“往旺望忘妄”(都是wang音)。不过GB2312并不是严格按拼音来排列字符的,稍生僻一点wang音字并没有排在一起,比如“惘”字的编码是E3 AF。字符在GB2312里的排列是有规律的,参见http://www.qqxiuzi.cn/zh/hanzi-gb2312-bianma.php。
同时,在UTF-8编码下“王”字对应的是11100111 10001110 10001011(E7 8E 8B),是三个字节。

这样我们就能理解乱码是怎样产生的了,乱码是因为一个字符在两种编码里对应的二进制数不同
假设有一个网页上显示单独一个“王”字,网页是用GB2312来编码的,这样浏览器通过网络接收到的二进制数就是CD F5,而浏览器用GB2312来解读的时候就把CD F5给“翻译”成了“王”字,我们就能正常浏览网页。假设浏览器试图用UTF-8编码来解读这个网页时,你会看到浏览器显示这样的字符“��”,这就是因为在UTF-8下面“王”字不是CD F5,实际上CD F5在UTF-8下面不能正确地映射到有意义的字符。