序言:

本人在刚接触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. 怎么解决svn清理失败且路径显示乱码问题

    怎么解决svn清理失败且路径显示乱码问题 参考文章: (1)怎么解决svn清理失败且路径显示乱码问题 (2)https://www.cnblogs.com/moyand/p/5465225.html ...

  2. 解决 IntelliJ IDEA Tomcat 控制台中文输出乱码问题

    解决 IntelliJ IDEA Tomcat 控制台中文输出乱码问题 参考文章: (1)解决 IntelliJ IDEA Tomcat 控制台中文输出乱码问题 (2)https://www.cnbl ...

  3. 成功解决Eclipse打开py等文件出现乱码

    成功解决Eclipse打开py等文件出现乱码 目录 解决问题 解决思路 解决方法 解决问题 Eclipse打开py等文件出现中文乱码 解决思路 默认读取文件是以gbk的方式,需要在属性中进行转换一下即 ...

  4. 成功解决:连接sql server时插入数据库内容为乱码,并且输出也为乱码

    成功解决:连接sql server时插入数据库内容为乱码,并且输出也为乱码 目录 解决问题 解决办法 解决问题 pymssql连接数据库,插入记录显示乱码,python输出也乱码 连接语句 conn ...

  5. win10很多软件显示模糊_win10安装软件出现乱码怎么办 win10新装软件显示乱码的解决方法_windows10_Windows系列_操作系统...

    win10安装软件出现乱码怎么办?在新安装软件时,安装的过程中,安装界面出现了乱码,已至于无法正常安装,这种情况应该如何解决呢?下文中为大家带来了win10新装软件显示乱码的解决方法.感兴趣的朋友不妨 ...

  6. 15、解决14中csv用excel打开乱码的问题 open('zhihu.csv','w',newline='',encoding='utf-8-sig')...

    解决14中csv用excel打开乱码的问题 ,其实就是在写csv的时候把 utf-8 改成 utf-8-sig open('zhihu.csv','w',newline='',encoding='ut ...

  7. ajax传输json数据格式乱码_解决Ajax加载JSon数据中文乱码问题

    一.问题描述 使用zTree的异步刷新父级菜单时,服务器返回中文乱码,但项目中使用了SpringMvc,已经对中文乱码处理,为什么还会出现呢? 此处为的异步请求的配置: Java代码 async: { ...

  8. maple 2018 窗口关闭提示乱码_如果解决SOLIDWORKS工程图转CAD字体出现乱码的问题_SolidWorks生信科技...

    操作SOLIDWORKS工程图转CAD时,由于SOLIDWORKS使用的是Windows字体,而CAD使用的是线性字体,字体就容易出现乱码的苦恼.一般出现乱码是因为字体映射里面没有中文,所以会导致乱码 ...

  9. php excelreader 中文,如何解决php excel reader导出excel中文乱码?

    解决php excel reader导出excel中文乱码的方法:1.如果不使用dump函数,可以通过修改[_defaultEncoding]变量解决问题:2.如果使用dump函数导出excel,需要 ...

  10. python2中文输出代码_解决vscode python print 输出窗口中文乱码的问题

    解决vscode python print 输出窗口中文乱码的问题 发布时间:2020-09-17 23:53:25 来源:脚本之家 阅读:119 一.搭建 python 环境 在 VSC 中点击 F ...

最新文章

  1. unicode环境下用CFile读取txt的若干疑惑,该如何处理
  2. springboot工程添加404页面
  3. 带你玩转关键字Synchronized
  4. Centos7 amp;amp; Docker amp;amp; Jenkins amp;amp; ASP.NET Core
  5. 【MFC系列-第9天】MFC消息映射机制的原理
  6. [Redux/Mobx] 说说redux的优缺点分别是什么?
  7. SESSIONS.ser 的问题
  8. ChaiNext:大盘调整,主流币种还未稳住阻力位
  9. Redis之-字符串类型
  10. [转载] OpenCV-Python 图像处理(二):图像的读取、显示与保存
  11. 华硕主板如何设置开机自启_华硕主板怎么设置自动开机,华硕主板设置通电开机-...
  12. windows 命令行代理设置
  13. 【Oracle】建立关联三个表的视图
  14. org.apache.kafka.clients.consumer.CommitFailedException
  15. android 设备注册,Android平台上PMEM的使用及Platform设备注册(二)
  16. SAP产品合规管理(Product Compliance)之危险品管理(Dangerous Goods Management)功能讲解
  17. chat--hxxdfd
  18. PDF文件怎么拆分?看完就会了!
  19. 关于人生的一些想法,和淘客SEO的思想。
  20. 云崽部署问题解决贴:关于Yunzai-Bot部署后可能遇到的QQ版本过低问题||和一个puppeteer Chromium启动失效问题

热门文章

  1. 小程序 长按转发_微信小程序实现限制用户转发功能的实例代码
  2. 计算机键盘中英文,电脑键盘中英文切换键
  3. 六、Xbar-R、柏拉图管制分析
  4. 如何才能把qlv格式转换成mp4格式
  5. Java实现鉴权失败达到一定次数锁定IP并释放到期IP
  6. OPNsense - 多功能高可靠易使用的防火墙(二)
  7. tableau连接Mysql出现的密码验证 cannot be loaded
  8. 删除Windows 7系统保留分区100MB
  9. 求最大公约数的4种常用算法
  10. 9 Nextflow configuration