date: 2021-06-12title: Python中的编码与解码 #标题
tags: python #标签
categories: python # 分类

我们知道,最早的字符串编码是ASCII编码,它仅仅是对10个数字、26个大小写英文字母以及一些特殊符号进行了编码。ASCII码最多只能表示256个符号,每个符号只需要占用1个字节。

随着计算机的发展,各国的语言都需要进行编码,于是相继出现了GBK、GB2312、UTF-8编码等,其中GBK和GB2312是我们中文编码标准,规定英文字符占用1个字节,中文字符占用两个字节;而UTF-8是国际通过的编码格式,它包含了全世界所有国家都需要用到的字符,其规定英文字符占用1个字节,中文字符占用3个字节。

Python 3 默认采用UTF-8编码格式,有效的解决了中文乱码问题。

在python中,有2中常用的字符串类型,分别为str和bytes类型,其中str用来表示Unicode字符,bytes用来表示二进制数据。str类型和bytes类型之间就需要使用encode()和decode()方法进行转换。

encode()方法

encode()方法为字符串类型str提供的方法,用于将str转换成bytes类型,这个过程也被称为“编码”。

encode()方法的语法格式如下:

  1. str.encode([encoding="utf-8"][,errors="strict"])
  2. '''
  3. 注意:格式中用方括号[]括起来的参数为可选参数(正常写的时候不要加[]括号哦),
  4. 也就是说,在使用此方法时,可以使用[]中的参数,也可以不使用。
  5. '''

该方法各个参数的含义如下所示:

参数 含义
str 表示要进行转换的字符串。
encoding = “utf-8” 指定进行编码时采用的字符编码,该选项默认采用 utf-8 编码。例如,如果想使用简体中文,可以设置 gb2312。 当方法中只使用这一个参数时,可以省略前边的“encoding=”,直接写编码格式,例如 str.encode(“UTF-8”)。
errors = “strict” 指定错误处理方式,其可选择值可以是:strict:遇到非法字符就抛出异常。ignore:忽略非法字符。replace:用“?”替换非法字符。xmlcharrefreplace:使用 xml 的字符引用。该参数的默认值为 strict。

注意,使用 encode() 方法对原字符串进行编码,不会直接修改原字符串,如果想修改原字符串,需要重新赋值。

encode方法示例

  1. # 将str类型字符串转换成bytes类型
  2. str = '我在学习写Python'
  3. print(str.encode())
  4. # 上面那种方式默认采用utf-8编码,也可以手动指定其他编码格式,如:
  5. str = '我在学习写Python'
  6. print(str.encode('GBK'))
  7. # 如果同时想用问号代替非法字符,可以这样写:
  8. str = '我在学习写Python'
  9. print(str.encode(encoding='GBK', errors='strict'))
  10. # 打印结果如下:
  11. b'\xe6\x88\x91\xe5\x9c\xa8\xe5\xad\xa6\xe4\xb9\xa0\xe5\x86\x99Python'
  12. b'\xce\xd2\xd4\xda\xd1\xa7\xcf\xb0\xd0\xb4Python'
  13. b'\xce\xd2\xd4\xda\xd1\xa7\xcf\xb0\xd0\xb4Python'

decode()方法

和encode()方法正好相反,decode()方法用于将bytes类型的二进制数据转换为str类型,这个过程也被称为“解码”。

decode()方法的语法格式如下:

  1. bytes.decode([encoding="utf-8"][,errors="strict"])

同encode()方法一样,方括号[ ] 中的参数非必须。

该方法中参数的含义如下所示:

参数 含义
bytes 表示要进行转换的二进制数据。
encoding=”utf-8” 指定解码时采用的字符编码,默认采用 utf-8 格式。当方法中只使用这一个参数时,可以省略“encoding=”,直接写编码方式即可。 注意,对 bytes 类型数据解码,要选择和当初编码时一样的格式。
errors = “strict” 指定错误处理方式,其可选择值可以是:strict:遇到非法字符就抛出异常。ignore:忽略非法字符。replace:用“?”替换非法字符。xmlcharrefreplace:使用 xml 的字符引用。该参数的默认值为 strict。

使用示例

  1. str='我在学习写Python'
  2. bytes=str.encode()
  3. print(bytes.decode())
  4. # 输出如下:
  5. 我在学习写Python
  6. # 注意:如果编码时不是默认的UTF-8编码,则解码是需要选择和编码时一样的格式
  7. # 否则会抛出异常,如下:
  8. str='我在学习写Python'
  9. bytes=str.encode('GBK')
  10. print(bytes.decode('utf-8'))
  11. # 异常如下:
  12. Traceback (most recent call last):
  13. File "F:/software/llvjianzhao_python/python_demo/demo_01.py", line 761, in <module>
  14. print(bytes.decode('utf-8'))
  15. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: invalid continuation byte
  16. # 但如果是编码使用utf-8,那么也可以使用gbk解码
  17. # 只是会有乱码而已
  18. str='我在学习写Python'
  19. bytes=str.encode('utf-8')
  20. print(bytes.decode(encoding='GBK'))
  21. # 打印如下:
  22. 鎴戝湪瀛︿範鍐橮ython