60512发表于 2020-01-02 15:10:09
只看该作者楼主

【综合】Python编码介绍——encode和decode 详细整理版 [复制链接]

作者:HW-WX


在 python 源代码文件中,如果你有用到非ASCII字符,则需要在文件头部进行字符编码的声明,声明如下:
# coding: UTF-8

因为python 只检查 #、coding 和编码字符串,所以你可能回见到下面的声明方式,这是有些人为了美观等原因才这样写的:
#-*- coding: UTF-8 -*-

常见编码介绍:
GB2312编码:适用于汉字处理、汉字通信等系统之间的信息交换
GBK编码:是汉字编码标准之一,是在 GB2312-80 标准基础上的内码扩展规范,使用了双字节编码
ASCII编码:是对英语字符和二进制之间的关系做的统一规定
Unicode编码:这是一种世界上所有字符的编码。当然了它没有规定的存储方式。
UTF-8编码:是 Unicode Transformation Format - 8 bit 的缩写, UTF-8 是 Unicode 的一种实现方式。它是可变长的编码方式,可以使用 1~4 个字节表示一个字符,可根据不同的符号而变化字节长度。

编码转换:
         Python内部的字符串一般都是 Unicode编码。代码中字符串的默认编码与代码文件本身的编码是一致的。所以要做一些编码转换通常是要以Unicode作为中间编码进行转换的,即先将其他编码的字符串解码(decode)成 Unicode,再从 Unicode编码(encode)成另一种编码。
decode 的作用是将其他编码的字符串转换成 Unicode 编码,eg name.decode(“GB2312”),表示将GB2312编码的字符串name转换成Unicode编码
encode 的作用是将Unicode编码转换成其他编码的字符串,eg name.encode(”GB2312“),表示将Unicode编码的字符串name转换成GB2312编码
所以在进行编码转换的时候必须先知道 name 是那种编码,然后 decode 成 Unicode 编码,最后载 encode 成需要编码的编码。当然了,如果 name 已经就是 Unicode 编码了,那么就不需要进行 decode 进行解码转换了,直接用 encode 就可以编码成你所需要的编码。值得注意的是:对 Unicode 进行编码和对 str 进行编码都是错误的。

        具体的说就是:如果在UTF-8文件中,则这个字符串就是 UTF-8编码的。它的编码取决于当前的文本编码。当然了,GB2312文本的编码就是GB2312。要在同一个文本中进行两种编码的输出等操作就必须进行编码的转换,先用decode将文本原来的编码转换成Unicode,再用encode将编码转换成需要转换成的编码。
eg:
        由于内置函数 open() 打开文件时,read() 读取的是 str,读取后需要使用正确的编码格式进行 decode()。write() 写入时,如果参数是 Unicode,则需要使用你希望写入的编码进行 encode(),如果是其他编码格式的 str,则需要先用该 str 的编码进行 decode(),转成 Unicode 后再使用写入的编码进行 encode()。如果直接将 Unicode 作为参数传入 write() ,python 将先使用源代码文件声明的字符编码进行编码然后写入。

       对于从python2.7过来的人,对python3的感受就是python3对文本以及二进制数据做了比较清晰的区分。文本总是Unicode,由str类型进行表示,二进制数据使用bytes进行表示,不会将str与bytes偷偷的混在一起,使得两者的区别更加明显。在python2中会明显发现不能将str与bytes拼接在一起,也不能在bytes中查找字符。
然而在实际应用中经常需要对两者进行转换操作以便后续的代码能够顺利跑完。两者之间的关如下所示:

str->bytes:encode编码
bytes->str:decode解码


字符串通过编码成为字节码,字节码通过解码成为字符串。

-
Python 代码
01>>> text = '我是文本'
02>>> text
03'我是文本'
04>>> print(text)
05我是文本
06>>> bytesText = text.encode()
07>>> bytesText
08b'\xe6\x88\x91\xe6\x98\xaf\xe6\x96\x87\xe6\x9c\xac'
09>>> print(bytesText)
10b'\xe6\x88\x91\xe6\x98\xaf\xe6\x96\x87\xe6\x9c\xac'
11>>> type(text)
12<class 'str'>
13>>> type(bytesText)
14<class 'bytes'>
15>>> textDecode = bytesText.decode()
16>>> textDecode
17'我是文本'
18>>> print(textDecode)
19我是文本
对于这些可以这么理解:

编码就是将字符串转换成字节码,涉及到字符串的内部表示。
解码就是将字节码转换为字符串,将比特位显示成字符。

其中decode()与encode()方法可以接受参数,其声明分别为:

bytes.decode(encoding="utf-8", errors="strict")
str.encode(encoding="utf-8", errors="strict")

其中的encoding是指在解码编码过程中使用的编码(此处指“编码方案”是名词),errors是指错误的处理方案。
errors -- 设置不同错误的处理方案。默认为 'strict',意为编码错误引起一个UnicodeError。 其他可能得值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及通过 codecs.register_error() 注册的任何值。

获取编码的方式:
判断是 s 字符串否为Unicode,如果是返回True,不是返回False :
isinstance(s, unicode)

下面代码可以获取系统默认编码:

-
Python 代码
1#coding=utf-8
2import sys
3print sys.getdefaultencoding()


希望在学习知识回顾总结的同时,能对大家有所帮助,有所收获记得点赞阿,回复当然更好啦,哈哈。。。

楼主发表于 2020-01-02 15:11:10
只看该作者沙发
楼主发表于 2020-01-02 15:11:15
只看该作者板凳
楼主发表于 2020-01-02 15:11:21
只看该作者地板
楼主发表于 2020-01-02 15:11:26
只看该作者5 #
楼主发表于 2020-01-02 15:11:48
只看该作者9 #

您需要登录后才可以回帖

登录注册
发表回复