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()方法的语法格式如下:
str.encode([encoding="utf-8"][,errors="strict"])
'''
注意:格式中用方括号[]括起来的参数为可选参数(正常写的时候不要加[]括号哦),
也就是说,在使用此方法时,可以使用[]中的参数,也可以不使用。
'''
该方法各个参数的含义如下所示:
参数 | 含义 |
---|---|
str | 表示要进行转换的字符串。 |
encoding = “utf-8” | 指定进行编码时采用的字符编码,该选项默认采用 utf-8 编码。例如,如果想使用简体中文,可以设置 gb2312。 当方法中只使用这一个参数时,可以省略前边的“encoding=”,直接写编码格式,例如 str.encode(“UTF-8”)。 |
errors = “strict” | 指定错误处理方式,其可选择值可以是:strict:遇到非法字符就抛出异常。ignore:忽略非法字符。replace:用“?”替换非法字符。xmlcharrefreplace:使用 xml 的字符引用。该参数的默认值为 strict。 |
注意,使用 encode() 方法对原字符串进行编码,不会直接修改原字符串,如果想修改原字符串,需要重新赋值。
encode方法示例
# 将str类型字符串转换成bytes类型
str = '我在学习写Python'
print(str.encode())
# 上面那种方式默认采用utf-8编码,也可以手动指定其他编码格式,如:
str = '我在学习写Python'
print(str.encode('GBK'))
# 如果同时想用问号代替非法字符,可以这样写:
str = '我在学习写Python'
print(str.encode(encoding='GBK', errors='strict'))
# 打印结果如下:
b'\xe6\x88\x91\xe5\x9c\xa8\xe5\xad\xa6\xe4\xb9\xa0\xe5\x86\x99Python'
b'\xce\xd2\xd4\xda\xd1\xa7\xcf\xb0\xd0\xb4Python'
b'\xce\xd2\xd4\xda\xd1\xa7\xcf\xb0\xd0\xb4Python'
decode()方法
和encode()方法正好相反,decode()方法用于将bytes类型的二进制数据转换为str类型,这个过程也被称为“解码”。
decode()方法的语法格式如下:
bytes.decode([encoding="utf-8"][,errors="strict"])
同encode()方法一样,方括号[ ] 中的参数非必须。
该方法中参数的含义如下所示:
参数 | 含义 |
---|---|
bytes | 表示要进行转换的二进制数据。 |
encoding=”utf-8” | 指定解码时采用的字符编码,默认采用 utf-8 格式。当方法中只使用这一个参数时,可以省略“encoding=”,直接写编码方式即可。 注意,对 bytes 类型数据解码,要选择和当初编码时一样的格式。 |
errors = “strict” | 指定错误处理方式,其可选择值可以是:strict:遇到非法字符就抛出异常。ignore:忽略非法字符。replace:用“?”替换非法字符。xmlcharrefreplace:使用 xml 的字符引用。该参数的默认值为 strict。 |
使用示例
str='我在学习写Python'
bytes=str.encode()
print(bytes.decode())
# 输出如下:
我在学习写Python
# 注意:如果编码时不是默认的UTF-8编码,则解码是需要选择和编码时一样的格式
# 否则会抛出异常,如下:
str='我在学习写Python'
bytes=str.encode('GBK')
print(bytes.decode('utf-8'))
# 异常如下:
Traceback (most recent call last):
File "F:/software/llvjianzhao_python/python_demo/demo_01.py", line 761, in <module>
print(bytes.decode('utf-8'))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: invalid continuation byte
# 但如果是编码使用utf-8,那么也可以使用gbk解码
# 只是会有乱码而已
str='我在学习写Python'
bytes=str.encode('utf-8')
print(bytes.decode(encoding='GBK'))
# 打印如下:
鎴戝湪瀛︿範鍐橮ython