AI智能
改变未来

中文汉字在python中的编码

本文来自该链接的总结,截图来自该链接,后续会继续看该链接并更新随笔:

https://kunststube.net/encoding/

首先让我们来看看什么是编码和解码:

来一个小例子:

apple -> 苹果。

为什么在我们脑海中apple对应苹果呢?我们可以认为在脑海中有一张表,表里面“apple”这个东西指向了“苹果”。

其实编码就是通过一个对应表,把01位串映射到我们人类可以读懂的字符。

以上是ASCII编码的部分编码规则,ASCII编码把一连串的01位串每八个做一次映射。解码请自行理解。

接着让我们来看看Unicode编码是什么:

我们知道,这个世界上有很多种编码,big5,gb18030,Shift-JIS,Mac Roman,utf-8等,其中utf-8能够编码绝大多数字符,如果其不能编码,意味着文件中有的01位串是错误的,我们也知道,一个字节(8bit)可以编码256种符号,那么一个汉字能否用一个字节来编码呢?显然不够,因为汉字不止256个。那么两个字节呢,欸,可以,big5就是这样的一个编码方式(01位串与字符的对照表),它使用两个字节来编码汉字,而且big5涵盖了大多数的繁体字,简体字应该没有很好支持。gb18030则同时涵盖了简体和繁体字(简体和繁体字在gb18030这张表上有表项)。

下图是gb18030编码表的一部分,可见其在解码01位串的时候会每16位进行截断,然后做映射。

不同编码编码的字符范围不同,那么如何对这些编码做一个统一呢,Unicode可以做到。

Unicode基本上记录了所有的字符它一共可以定义上千万种符号,那么Unicode需要采用的编码单位是多少位呢?答案是0,因为Unicode没有被用来当作编码方式,它只是记录了所有字符与数字的对应关系,它不是编码表。

其次再讨论一下不同的编码方式对二进制串的解释:

个人认为,不同的编码方式是为了编码不同的语言诞生的,所以对0000 0001的解码对应的字符也很容易有所不同,因为每种语言种人们觉得最基本的符号不同(汉字可以是‘一’英文可以是‘a’日文中也许是‘

の’),所以同一个位串,在不同的编码方式种,很容易对应不同的字符。

同样的,同一个字符在不同的编码方式中会被编码成不同的01位串:

最后讨论一下为什么把用编码方式A编码的文件用另一种编码方式B保存之后,该文件便基本被破坏而且很难还原:

当我们用A(比如gbk)解码该文件后,再把他保存为令一种编码方式的文件,也就是用另一个编码表B(比如utf8)去把字符编码为01位串(这样保存实际上再保存乱码),通过上面的一张图片我们可以知道,同样的字符再不同的编码方式种会被编码为不同的01位串,也就是说该文件的01数据会被改变!一旦保存,那么我们用原来的编码表A去解码的时候仍然会乱码,因为该文件内的01bit已经被改变,除非你用B去解码保存后的文件,当然看到的会是乱码,然后再用A去编码,再保存,那么文件就会还原了。能还原的前提是你知道你用什么编码改变了该文件,而且原来的编码方式是什么。(试想一下,你从网上下载了一个文件,打开之后发现是乱码,你能怎么办?)

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 中文汉字在python中的编码