字符编解码_篇一

阅读条件:

对字符编解码有一些了解,但是又不够深入,在实际项目中遇到问题有些束手无措的同学


<!--more-->

前言

最近在项目中遇到了编解码错误的问题,发现自己对这块的知识掌握的不是很全面,于是决定花点时间尽量弄清楚来龙去脉.

前置知识

在我们深入学习编解码的知识之前,我们看看哪些相关的前置知识,同时将我们的问题聚焦.

  1. 计算机只能处理0和1,而人是无法直接理解0和1.
  2. 既然双方无法直接理解对方,那么根据冯诺依曼结构,必然要在输入和输出时做相应的转换,一旦进入计算机内部字符必然以01比特串的形式存在.
  3. 在输出时,将计算机能够理解的0/1比特转换成人能够理解的内容.在输入时,将人能理解的内容转换为计算机可以理解的0/1比特.
  4. 我们可以将这种转换称为编解码.另外人能够理解的信息可以分为视频,音频,图片,文字等,所以编解码又可以分为视频编解码,音频编解码等.

我们聚焦的知识是字符编解码部分.

模型

self-model.jpg

前面我们提到计算机必然需要将人能够理解的有意义的字符转换成01比特串,那么必然要存在这样一种映射关系来进行转换.同时保证显示的时候可以将01比特串转换为字符,保证信息不丢失.

事实上,这个转换的过程是非常复杂的.我们仅仅考虑输入一个字符,至少需要涉及驱动,输入法,窗口管理器,进程间通信等等内容.

能力所限,我们定义了上图的模型,我们主要介绍虚线以上的内容.假定已经存在一个字符和01比特的映射表,黑盒具有根据映射表将字符和01比特串的来回转换的能力.

我们将主要介绍两部分的知识:

  1. 字符和01比特串之间的这种映射关系本身的发展历史
  2. 用户空间程序,尤其是Python3程序是如何使用这种映射关系的.

相信我,即使是这两部分也会有足够的信息量.

疑惑

我们经常说带着问题找答案.我希望在本系列结束后,可以回答如下的问题.

  1. 字节,字符等术语是什么意思?
  2. 现代编码模型是什么鬼?
  3. 常见的字符编解码有哪些?互相之间有什么关系?哪些和ascii码兼容?
  4. 什么时候发生编解码?编解码的时候发生了什么?
  5. 乱码是怎么发生的?
  6. 应用程序读写文件是怎么决定编码方案的?
  7. UnicodeDecodeError/UnicodeEncodeError是怎么发生的

问题比较多,大家可以尝试着回答. 如果你觉得对这些问题都没有疑问,那么我觉得这个系列可以跳过.

尾记

学而不思则罔.

大部分程序员应该都被字符编解码,乱码折磨过.我这里将稍微系统地总结下相关的字符编解码知识.