02-Python中文乱码_Python

 


一、基本概念

1. 比特位(Bit)

是计算机最小的存储单位
以0或1来表示比特位的值

2. 字节(Byte)

是计算机中数据存储的基本单元
一字节等于一个8个比特位

3. 字符(Character)

是一个信息单位
是各种文字和符号的统称

4. 字符集(Character Set)

是某个范围内字符的集合
不同的字符集规定了不同字符的个数

5. 字符码(Code Point)

字符集中每个字符的数字编号

6. 字符编码(Character Encoding)

是将字符集中的字符码映射为字节流的一种具体实现方案
ASCII 编码、UTF-8 编码、GBK 编码

7. 编码(Encoding)

编码的过程是将字符转换成字节流

8. 解码 (Decoding)

解码的过程是将字节流解析为字符

二、具体解释

1. 我们想做的事情,最终的目的?

  • 将文本内容存储到存储器当中
  • 从存储器中取出来文本内容进行相关操作

02-Python中文乱码_Python_02

2. 存储器的能接受的存储方式?

  • 你现在要把文本内容存储在存储器里面;所以你能不考虑它的感受?
    • 举个例子 — 商场的储物柜

      02-Python中文乱码_字符编码_03
      储物柜组成:一个大箱子有很多小柜子;一个小柜子里面有几个小格子;

    (1) 请问:你租柜子的时候,能租一个格子吗?不能,只能租一个柜子;对不对?所以一个柜子就是一个“基本存储单元”;
    (2) 请问:小柜子里面真正放东西的时候,是不是放在小格子里面?所以,一个小格子,就是 “最小存储单位”;

    • 类比到存储器的存储结构,如下:

      02-Python中文乱码_人工智能_04

3. 存储目的的抽象

  • 我们的最终目的

    02-Python中文乱码_Python_02

  • 抽象后的图示

    02-Python中文乱码_后端_06
    存储的过程称为 “编码”
    取出的过程称为 “解码”

4. 引发的问题?

  • 如何存储字符?(字符都是一些a,b,c,1, 2, 3等等; 存储器只能存储0和1)

    02-Python中文乱码_Python_07

  • 按照怎样的规范进行存储?(每个字符占用多少字节?)

    02-Python中文乱码_后端_08

5. 解决方案(统一的标准:编码解码规范)

  • 由具体的编码,来确定每一个字符所对应的数值;让存储器直接存储数值就可以;到时候,解码的时候;取出对应的数据,再按照编码规范找到对应的字符即可

    02-Python中文乱码_人工智能_09

6. 乱码的原因?

  • 存字符“a”的时候,按照编码1,转换的数值是97;
  • 下次从存储器取出来数值97之后,居然按照编码2,进行解码;
  • 而编码2里面的97,有可能对应的是s;
  • 这样就造成“乱码”;(如上图)
    所以,避免乱码的方式就是;保证编码和解码使用的是同一套字符编码;

7. 既然乱码是由使用了不同的字符编码引起的;那为什么搞这么多套?合成一套,弄一个标准不就可以了?

言之有理,但凡事都是一个发展进化的过程;
而且,“大而全”不一定好;拖拉机拉货特别多;你能开着去上班吗?
  • 细看“字符编码”发展历程
  1. 计算机最早发明于美国, 英语中主要就包括26个字母(大小写), 10个数字, 标点符号, 控制符等等; 所以, 最终就制定了ASCII字符编码, 映射了字符和字符码的关系, 并使用一个字节的后七位(0 - 127)来存储; (当时真TM没想到, 计算机会普及)
  1. 慢慢计算机普及到西欧其他地区, 发现好多字符没法识别处理; 于是对ASCII进行了扩展, 叫 EASCII编码; 还是一个字节, 从128 – 255; 但是针对于这一块的扩充, 各个厂家各有自己的标准(比如当时比较有名的CP437); 最后导致互相之间没法沟通; 所以, 后来, 由国际标准化组织(ISO) 以及国际电工委员会(IEC)联合制定了一个标准 ISO/8859-1(Latin-1), 继承了CP437的128-159; 重新定义了160-255;
  1. 然后到中国之后, 全都懵逼了; 汉字博大精深, 一个字节肯定不够; so, 国人自己搞了一个GB2312来存储中文, 6763个汉字;(双字节, 兼容ASCII) 可是, 一开始还很爽; 后来发现还有繁体字, 藏文, 蒙文, 维吾尔文… 懵逼X2; 于是一狠心, 搞了一个GBK, 全给他们搞进来;
  1. 中国是搞定了, 那日本,韩国… … 如果到时候, 各有各的字符编码, 那该怎样沟通?比如 666 , 在中国代表NB; 在岛国代表SB, 那就乱套了; 所以, 统一联盟国际组织, 提出了Unicode编码; 涵盖了世界上所有的文字, 每一个字符都有对应的唯一一个字符码, 这回大家都开心了 但是, 针对于每个字符码, 使用几个字节存储的问题, 又存在几个不同的具体解决方案; 比如utf-8, utf-16, utf-32… 所以, 其实, 我们讨论这边编码的时候, 都是指Unicode编码