阅读条件:
对字符编解码有一些了解,但是又不够深入,在实际项目中遇到问题有些束手无措的同学
<!--more-->
前言
最近在项目中遇到了编解码错误的问题,发现自己对这块的知识掌握的不是很全面,于是决定花点时间尽量弄清楚来龙去脉.
前置知识
在我们深入学习编解码的知识之前,我们看看哪些相关的前置知识,同时将我们的问题聚焦.
- 计算机只能处理0和1,而人是无法直接理解0和1.
- 既然双方无法直接理解对方,那么根据冯诺依曼结构,必然要在输入和输出时做相应的转换,一旦进入计算机内部字符必然以01比特串的形式存在.
- 在输出时,将计算机能够理解的0/1比特转换成人能够理解的内容.在输入时,将人能理解的内容转换为计算机可以理解的0/1比特.
- 我们可以将这种转换称为编解码.另外人能够理解的信息可以分为视频,音频,图片,文字等,所以编解码又可以分为视频编解码,音频编解码等.
我们聚焦的知识是字符编解码部分.
模型
前面我们提到计算机必然需要将人能够理解的有意义的字符转换成01比特串,那么必然要存在这样一种映射关系来进行转换.同时保证显示的时候可以将01比特串转换为字符,保证信息不丢失.
事实上,这个转换的过程是非常复杂的.我们仅仅考虑输入一个字符,至少需要涉及驱动,输入法,窗口管理器,进程间通信等等内容.
能力所限,我们定义了上图的模型,我们主要介绍虚线以上的内容.假定已经存在一个字符和01比特的映射表,黑盒具有根据映射表将字符和01比特串的来回转换的能力.
我们将主要介绍两部分的知识:
- 字符和01比特串之间的这种映射关系本身的发展历史
- 用户空间程序,尤其是Python3程序是如何使用这种映射关系的.
相信我,即使是这两部分也会有足够的信息量.
疑惑
我们经常说带着问题找答案.我希望在本系列结束后,可以回答如下的问题.
- 字节,字符等术语是什么意思?
- 现代编码模型是什么鬼?
- 常见的字符编解码有哪些?互相之间有什么关系?哪些和ascii码兼容?
- 什么时候发生编解码?编解码的时候发生了什么?
- 乱码是怎么发生的?
- 应用程序读写文件是怎么决定编码方案的?
UnicodeDecodeError
/UnicodeEncodeError
是怎么发生的
问题比较多,大家可以尝试着回答. 如果你觉得对这些问题都没有疑问,那么我觉得这个系列可以跳过.
尾记
学而不思则罔.
大部分程序员应该都被字符编解码,乱码折磨过.我这里将稍微系统地总结下相关的字符编解码知识.