原文:http://www.cnblogs.com/luguo3000/p/3592562.html

  编码问题一直都伴随着程序猿从不间断,刚开始学编程的时候好多次遇到编码问题,解 决了文件读取的编码问题,又遇到了网络编码问题,解决了网络编码问题又遇到了数据库编码问题。总结一下无非就是编码原理没搞清楚,希望本文能从原理上让菜 鸟们理解编码,遇到问题可以从原理上搞定编码。

  一.编码

  人类先有了自己的语言,交流了若干个世纪,然后出现了计算机。可惜计算机只认0和1,人类只能认文字,双方都不能妥协,那就必须要有一个从文字到0、1的映射了。从文字到0、1的映射称为编码,反过来从0、1到文字叫解码。

  具体什么 是编码?先来咬文嚼字一下吧。编就是将某样东西按照一定的规则放到一起,码在这里是数字的意思。编码就是将某东西编成数字。比如邮政编码,就是将不同范围 内的邮局编成不同的数字。计算机里只有0和1,编码就是将文本字符编成一系列的0和1,看起来好像是废话啊,但这确实是编码的本质。

  后来经过编码,计算机屏幕上终于可以显示“Hello World”了。学计算机之前谁都不知道有这么一个过程,因为一切看上去都理所当然。这种根深蒂固的认识让我们对编码理解起来犯了难。

  首先屏幕 的显示跟计算机存储是两码事,屏幕对应人们的视觉认知,它是无形的,你找不出来在哪里刻了这么两个单词,而计算机存储是客观存在的。计算机里只有0和1, 怎么来表示“Hello World”呢(假如我们在美国),那就需要将字母数字及标点符号编一个号。一个字节可以表示256个数字,表示字母数字标点足够了,所以用一个字节就可以对应一个字符了。这样一来计算机在显示文字的时候,先将0、1解码成对应的文字,然后在屏幕上渲染出来就可以了。我们将“Hello World”叫做字符,计算机实际存储的是字符对应的编号,这些编号就叫字节流。

  上边这种编码就是ASCII码,如果计 算机只在美国用或者只显示英语,那编码就是透明的,谁都不需要去关心编码,一切都觉得理所当然。可是计算机应用到了像中国这样的国家,这些国家的语言哪里 只是几个字母啊,有成千上万种不同的字符。很显然ASCII码就不能满足需求了,怎么办呢,每个国家都研制自己的编码呗,很显然这样做并不长久,每个国家 都有自己的编码实在有点乱,连两个国家的语言都不能放在一起。所以可以将世界当成一个整体,把所有的文字统一编号,这时候就出现了unicode编码。用 一个字节来表示一个字符显然是不够的,unicode编码用了两个字节来表示一个字符。其实,编码的发展过程并没有这么顺利,中间还是出现了很多其他的编 码,以后的文章可以详细说一下几种常用的编码。那问题岂不是解决了,大家都用unicode不就完事了吗,哪有这么简单呢,unicode出现之前计算机 领域已经有很多成型的操作系统软件甚至标准,不可能都统一改成unicode编码。所以到现在还是会遇到编码问题,unicode只是给我们提供了一种统 一解释所有文字的编码方案。要搞清楚,这里讨论的编码都是针对文本字符的。

  二.乱码

  编码之所以受到关注,乱码几乎起到了决定性的作用,如果没有乱码,一切都让大家觉得顺理成章,那谁还会关注编码呢。

  出现乱码的原因就是文本字符编码过程与字节流解码过程使用了不同的编码格式,这个往往归咎于解码格式选择错误,也就是说在解码的过程中出现了问题。如 果我的字符是用utf-8编码,你用GBK解码那肯定出问题。因为文字按照utf-8的编码规则编成的0、1,按照GBK的规则解码回来的文字并不是原来 的文字,这时候就会出现乱码了。这种问题会出现在文件读写、网络编码传输、数据库存取上。只要牵涉到字符都有可能出现乱码,因为只要有字符就会有解码过 程。

  还有一种 情况就是文件压根不是文本文件,也就是说根本就没有经过编码这个过程,那你去解码当然乱码了。比如64,你如果看做文本字符就是6和4两个字符,可以对应 编码格式进行编码。如果看做是数字64,那对应的存储结构是01000000,就没有编码过程,也就不需要去解码。

  要 搞清楚的一点就是同样的文本字符,经过不同的编码,在存储结构上是不一样的,但是代表的字符是一样的,不同编码真正的区别在于存储结构。反过来,相同的存 储结构,经过不同的解码,对应的文本字符并不一样,但是在内存上结构上并没有改变。如果碰到乱码,不要慌张,因为原始存储结构一动没动,只不过用错了解码 方式。就像一千个读者有一千个哈姆雷特一样,真实的哈姆雷特就在那里。

  乱码是显示在屏幕上才被认为是乱码,也就是说乱码取决于人的感官,乱码只有人才知道﹐计算机不认为这是乱码。

  三.文件编码

  不管是文本还是图片或视频,在计算机存储上都是一视同仁,全都是字节流。但是 从方便人们阅读的角度上还是分为文本文件和二进制文件。文本文件的可视形式就是文本字符,在存储和显示时有文本字符编解码的过程,可以直接用文本编辑器阅 读。除文本文件以外就是二进制文件,不同类型的二进制文件都有相应的结构标准,例如java的class文件,前四个字节代表文件类型,后边两个字节代表 大版本号,再后边两个字节代表小版本号。具体哪些字节代表什么意思,值是float类型还是int类型,都有一定的标准,所以需要特定的软件按照标准去读 取解析。

  在不同的编程语言中,往往提供不同的类对文本文件和二进制文件进行读写。最常 用的就是文本文件的读写例如C#中有StreamReader和StreamWriter,Java中有BufferedReader和 BufferedWriter。还有二进制文件的读写例如C#中有BinaryReader和BinaryWriter,Java中有 DataInputStream和DataOutputStream。当然读写二进制文件的类也可以读写文本文件,因为文本文件和二进制文件的存储在本质 上是没有区别的,都是二进制。只不过专门读写文本文件的类封装的更好,读写文本文件更方便。

从原理上搞懂编码——究竟什么是编码?什么是解码?什么是字节流?相关推荐

  1. 从原理上搞懂如何设置线程池参数大小?

    我们在使用线程池的时候,会有两个疑问点: 线程池的线程数量设置过多会导致线程竞争激烈 如果线程数量设置过少的话,还会导致系统无法充分利用计算机资源 那么如何设置才不会影响系统性能呢? 其实线程池的设置 ...

  2. 从原理上搞懂offsetWidth、scrollWidth、clientWidth以及其他偏移量

    1. 影响以上参数主要有哪些内容 笔者在总结这几个内容之前,也翻了很多书,看了很多帖子,始终没有搞清楚这几个内容的逻辑,每次记住了,没过几天就忘了,下次再被问到完全又分不清楚了. 于是又拿起了< ...

  3. 【好文链接】从原理上搞懂PID

    https://blog.csdn.net/qq_25352981/article/details/81007075

  4. 从原理上搞定编码-- Base64编码

    开发者对Base64编码肯定很熟悉,是否对它有很清晰的认识就不一定了.实际 上Base64已经简单到不能再简单了,如果对它的理解还是模棱两可实在不应该.大概介绍一下Base64的相关内容,花几分钟时间 ...

  5. php service原理,轻松搞懂WebService工作原理

    用更简单的方式给大家谈谈WebService,让你更快更容易理解,希望对初学者有所帮助. WebService是基于网络的.分布式的模块化组件. 我们直接来看WebService的一个简易工作流程: ...

  6. 汉字乱码_彻底搞懂这烦人的编码与乱码!

    ❝ 我们平时在处理文本文件或者网络请求时,时不时会遇到乱码的情况,这篇文章就带你彻底搞懂编码和乱码 ❞ 首先,我们要知道,在计算机中,一切都是用0和1来表示的.普通的txt文件.或者客户端发过来的数据 ...

  7. 一文搞懂数据转换之摘要、编码、加密、签名

    一.转义 转义的作用? 转义通常有两种功能.第一种是如果不进行转义就可能与语法规定的某些内容产生混淆,所以这些内容都被设计为需要转义. 第二种也叫字符引用,用于表示无法在当前上下文中被键盘录入的字符( ...

  8. springaop事务逻辑原理_搞懂Spring AOP,这一篇就够了

    看了这篇文章,如果你还是不会用AOP来写程序,请你打我!! =.=||| 引言 Spring AOP是一个对AOP原理的一种实现方式,另外还有其他的AOP实现如AspectJ等. AOP意为面向切面编 ...

  9. 容器原理(搞懂 layerID,diffID,chainID,cache-id 是什么)

    总览 镜像目录及文件说明 /var/lib/docker/image/overlay2 目录 distribution 目录 diffid-by-digest 保存了digest(layerID)-& ...

  10. 容器原理(搞懂 layerID,diffID,chainID,cache-id)

    文章目录 参考 总览 镜像目录及文件说明 镜像 Repository Image Layer 容器[#](https://www.cnblogs.com/koktlzz/p/14365025.html ...

最新文章

  1. group by 分组后 返回的是一个同属性的集合
  2. 面试官:说说Spring AOP、AspectJ、CGLIB ?它们有什么关系?
  3. 使用 .NET 实现 Ajax 长连接 (Part 1 - Comet Web Service)
  4. goroutine sync.Mutex互斥锁Lock的使用
  5. 1623: 街道路径条数
  6. matlab 取绝对值最快的犯法,求助被积函数有绝对值号的问题。
  7. spring小实验 用spring的方式管理JDBC
  8. Zabbix安装和使用配置小结
  9. [Python] 创建一个整数列表:range()
  10. SQLServer2005 中 XML类型方法中 XQuery中变量的参数化--匆忙整理
  11. 免费下论文的网站有哪些?
  12. Python数据分析-二手车数据用于机器学习二手车价格预测
  13. 华为交换机密码遗失怎么办?华为交换机密码恢复方法
  14. Java IO与文件读写
  15. 【有利可图网】PS实战教程36:巧用PS制作人物破碎消散效果
  16. 常见webshell工具
  17. CGroup(控制组)
  18. 送书 | 哈佛大学单细胞课程:笔记汇总前篇
  19. Android 原生分享文件到微信
  20. java stringbuilder 替换字符串_StringBuilder修改字符串内容,增,删,改,插

热门文章

  1. chrome鼠标手势插件
  2. Nginx: 104: Connection reset by peer 错误
  3. yolov3的weights文件获取方法(yolov3-spp.weights等等)
  4. 6寸相纸怎么排版两寸照片
  5. Codeforces Round #393 Frodo and pillows
  6. IOC/DI、AOP相关原理
  7. 无法打开internet站点,ie无法打开站点的解决方法【图解】
  8. 数学文化赏析期末笔记
  9. 浅谈大数据时代之影响力
  10. Crazy Kids