彻底解决乱码问题(一):为何会出现乱码

序言:

    本人在刚接触servlet时第一次遇到乱码问题,当时确实很令我抓狂,但也让我特别有兴趣,倍感兴奋. 心里想有时间一定要研究研究,终于时机到了,最近一段时间翻看了大量博客,文章,总算是懂了, 自己也有一点独特见解想分享一下, 于是产生了这篇博客.鉴于本人遇事刨根问底的性格,并且乱码的问题比较庞大,所以准备分层次,由浅入深的分析,也方便大家理解.

    这是第一篇,名为"彻底解决乱码问题(一):为何会出现乱码", 后几篇分别名为:"彻底解决乱码问题(二):彻底区分那些容易混淆的概念", "彻底解决乱码问题(三):详细分析常用字符集(ASCII,GB2312,GBK,Unicode)和字符编码(UTF-8,UTF-16)","彻底解决乱码问题(四):实战分析乱码问题","彻底解决乱码问题(五):诡异问题归纳以及该系列博客参考文献汇总","彻底解决乱码问题(附一):简体中文编码中区位码、国标码、内码、外码、字形码的区别及关系".

    我始终坚守一个概念: 要彻底弄清一个问题,一定要从最深处去分析,不然只是表面理解而已.乱码的产生一定与"字符编码"有关系,所以我的前几篇博客会详细介绍"字符编码",(这里提到的"字符编码"为广义上的概念,与后文提到的"字符编码"没有具体的联系,表示的不是同一意思,所以特意加了引号).暂定五篇,编写过程中如果有新的想法或者觉得不好的地方会调整,以具体发布的博客为准.


正文:

     大家都知道,计算机只认识0和1(实际上是晶体管的"关"和"开"的状态),所以所有数据都是将字符(如:字母'A',汉字'中',符号'?'等,统称字符)以某种编码方案将字符进行编码后,把产生的二进制字节流储存在计算机中.那如何将字符重新显示出来呢?就是用相同的编码方案将二进制字节流解码后,形成了我们的字符. 那么乱码问题就很好理解了:我们用编码方案A将一串字符编码,却使用了编码方案B来解码,因为编码方案A和B具体的实现不同,也就是编码和解码的方式不同,所以B解码出来的字符与A解码出的字符不同,所以就出现了乱码.

这样说比较抽象.举个例子:

     比如我们要表达"能"的意思,英文中对应的单词是"can",此过程可以理解为:将"能"这个意思用英文的编码方案编码成"can"(相当于编码后产生的二进制字节流).老美子懂英文,看到"can"就知道是"能"的意思,此过程可以理解将"can"用英文解码为"能"的意思(相当于解码后产生的字符).

    但如果让咱们国家一个不懂英文的人看到这串"二进制流":can,他会将其理解为拼音并解读出不同的意思,比如可能是"残","惨",此过程可以理解为使用汉语拼音的编码方案将"can"解码成具体的汉字,显然此时表达的肯定不是"能"的意思,这不就是乱码了吗.

    简单来说就是,一个老美子想表达"能"这个意思,它相当于我们要输入的字符.老美子用"can"表示这个意思,相当于用英文的编码方案来编码这个"能","can"相当于编码出来的二进制字节流.而中国人有自己的"编码方案":汉语拼音.中国人会将"can"当做拼音,拼出具体的汉字,拼出来汉字的过程就相当于将"can"解码为中文,因为编码方案不同,所以表达的意思就不同,也就是乱码.

再通过一个冷笑话来解释一下:

    从前有位中国人与自己的夫人会见一位老美子,带了一名翻译. 老美子夸赞中国人:"Your wife is so beautiful.",中国人听后很谦虚说:"哪里哪里".耿直的翻译就对老美子说:"where,where". 老美子:???????

    笑话之余来解释一下这个过程: 在这个笑话中,"哪里哪里"就相当于二进制字节流,使用中文解码后就是"谦虚"的意思,且只能使用中文的方式来解码(中国文化博大精深,并不能只根据字面意思来理解).而耿直的翻译却使用英文的编码方案来解码这段二进制字节流,结果就是"where,where",老美子当然听不懂了.


     所以乱码的问题,本质上来说就是编码和解码采用的编码方案不同,但我们现在也仅仅知道这些,并不知道底层是怎样的过程,所以也就不能从根本上解决乱码问题,当遇到比较复杂的乱码问题时还是会束手无策,所以接下来几篇博客会深入介绍"字符编码"的相关知识.





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值