计算机编码解码和在python中的应用
编者在处理python某些程序时,遇到了一些编码解码的困惑,基于此,总结了一些我认为比较关键的信息,希望能够帮后来者建立一条清晰的逻辑线。
1、当计算机在工作时,内存中的数据一直是以Unicode的编码方式表示的,当数据要保存到磁盘或者网络传输时,才会使用utf-8或gbk编码进行操作,在中国地区,系统默认的是gbk。
解释:Unicode能够容纳最多种类的字符,所以计算机内存采用Unicode去处理纷繁复杂的海量数据。但是,因为Unicode比较耗费空间。所以在存储到硬盘的时候,往往采用utf-8或者gbk编码。至于为何Unicode相对utf-8会占据更大空间的原因,请看此链接:https://www.cnblogs.com/OldJack/p/6658779.html。
不存在我们看到的这些字符!我们打出字符“abcd”的时候,只是图像信息显示了“abcd”,计算机内存只会有其对应的Unicode。所以,编码和解码的过程只存在于Unicode和其他类型的码之间。“编码”是“Unicode—>其他”;“解码”是“其他—>Unicode”。我们看到最终的显示的字符,用“解读”来说更合适,就是把Unicode码解读显示为图像信息。
2、有且只有Unicode可以直接被内存识别和使用,但存储是可以有多种编码形式的,取决于你指定的编码方式。
解释:比如在记事本中输入字符之后,保存使用ANSI,那么就是默认的gbk保持;如果使用utf-8保存,那么保存方式就是utf-8了。保存的过程,就是将你输入时产生的Unicode码转为你指定的码的“编码”过程。再次用记事本打开时,会自动识别你保存时的编码方式,因而能再次解码成功。引用前述链接的一张经典图:
如果你在记事本中输入“中国”,保存时选择ascii码,那么会报错或者读取的时候为乱码,因为ascii码没法对中文对应的Unicode进行编码。
python也是一个类似于记事本的编辑器,当你在文本开头写上#coding=ascii时候,就表明文件关闭存储的时候用ascii码的形式存入硬盘,再次打开的时候也会自动识别编码方式从而逆向解码。同样,当你在编辑时输入中文,开头仍为#coding=ascii,运行程序就会报错,因为文件交给解释器运行时ascii没法解码成正确的Unicode。
用python的open函数打开txt文件,如果该txt文件是用utf-8保存的话,也会报错。这个跟#coding=utf-8与否无关。前者是用系统默认的方式打开,后者只对此py文件内容的编码解码方式负责。而,open函数默认的是用系统的解码方式,也就是gbk,所以程序会显示:UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position...那如果我仍想要读取这个txt文件怎么办呢?用open函数是不行了,我们需要import codecs 然后使用它的codecs.open函数才可以。
3、python中的decode和encode函数就容易理解了,但是为了避免引起混淆,暂时把前面的内容忘掉,忘掉。此处,编码是我们常见的字符转为比特流,解码是比特流转为字符。至于如何转呢,就取决于你encoding的方式了,同样有utf-8,gbk,ascii等方式。其实就是相当于给我们展示编码解码的结果,实际上它们都是python的字符串类型,也就是bytes类和str类,decode就是把bytes类型转为str类型,encode就是把str类型转为bytes类型。