解析乱码产生的原因

编码与解码

编码-将字符转换为对应的二进制序列
解码-编码的逆过程,按照编码的规则将二进制序列转换成字符

为什么需要编码和解码

先小小的举个例子,你现在所看到的这篇文章都是一个个文字组成,这些文字在计算机内存中是以二进制序列的形式存在着的。将内存中的二进制序列转换成我们人眼可见的这些文字、英语符号这个过程就是解码,反之把可见的文章的内容转换成内存中二进制序列信息就叫编码。

详细过程:当你点击链接时,CSDN从其服务器的数据库中,准备将这篇文章的信息读取到内存中,比如CSDN数据库的编码格式是UTF-8,那它需要将磁盘上的UTF-8编码(二进制序列)转换成Unicode编码的二进制序列(内存中统一使用Unicode编码),在存储到内存中。服务器将内存中的Unicode编码的二进制序列读取出来,再转换成UTF-8编码的二进制序列,同网页一起发送到客户浏览器,客户浏览器以UTF-8编码的格式进行解码就成了我们肉眼可见的文字。若客户浏览器以别的格式进行解码就会出现乱码。(当然我们在服务器也可以将Unicode编码转换成其它格式的编码)
在这里插入图片描述
编码解码存在的意义是让我们所使用的文字或英文符号以唯一的二进制值存储在计算机中,而不会同其它符号或文字混淆。

编码格式众多的原因

计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。你可以想得到的是,全世界有上百种语言,因此出现了种类繁多的编码格式,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,由此也带来了问题-乱码。

乱码产生的原因

当解码和编码的格式(使用的规则)不同时,就会出现乱码。比如我是UTF-8格式的编码(二进制序列),客户端却以GBK的解码规则进行解码,此时就会出现乱码。

内存统一使用Unicode编码进行字符串,那为什么全世界不统一使用Unicode进行编码解码呢?
为了减小存储和传输的开销,下面详述。

Unicode、UTF-8、Ascll码的关系

Ascll码只使用一个字节,而Unicode通常使用两个字节(偏僻字使用四个字节)。
如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。因此我们通过将定长的Unicode编码转换成变长的UTF-8编码再进行传输和存储。

UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。而且ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

发布了14 篇原创文章 · 获赞 3 · 访问量 1474

猜你喜欢

转载自blog.csdn.net/qq_41008202/article/details/104817672
今日推荐