本文内容基于Python 3.x版本进行说明。
# 编码和解码 |
编码: 目的是让机器读懂语言,比如输入的字符是“中文”,编码以后则变成二进制格式。这样机器就能读懂了。
解码: 与编码相反的过程。
字符串通过编码转换为字节码,字节码通过解码转换为字符串
字符串即str
,在Python 3.x
中str类
包含了unicode
字符
字节码即bytes
,在Python3.x
中非unicode编码如UTF-8
,GBK
都被定义成bytes
str--->(encode)--->bytes
bytes--->(decode)--->str
unicode--->(encode)--->UTF8 GBK
UTF8 GBK--->(decode)--->unicode
我们要特别注意字符串编码和解码的字符集是否一致,因为如果两个字符集不一致的时候就会出现乱码。下面是编码转换的一个例子:
c = '中文' # 这是一个字符串str,unicode
print(type(c), c) # 输出<class 'str'> 中文
c = c.encode('utf-8') # 使用UTF-8将str类型编码为bytes类型
print(type(c), c) # 输出<class 'bytes'> b'\xe4\xb8\xad\xe6\x96\x87'
c = c.decode() # 使用默认方式将bytes类型解码为str类型
print(type(c), c) # 输出<class 'str'> 中文
# 解决乱码 |
首先,让我们明确一下可能导致字符串显示乱码的几个原因:
- Python解释器默认编码
- 源文件设置的编码
- 终端编码
如果Python解释器的默认编码与源文件设置的编码不一致,或者终端编码与源文件编码不一致,就会导致乱码。
c = '中国' # str
c = c.encode('utf-8') # 采用utf-8编码成bytes类
c = c.decode('gbk') # 试图采用gbk解码,因编码格式不一,报错如下:
--------------------------------------------------------------
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence
Python解释器编码: 指Python内部认为字符串str要转为bytes的默认转换方式,也就是当你使用不带参数的encode()
方法时,默认参数。你可以键入以下几行代码得到当前Python解释器编码类型:
import sys
print(sys.getdefaultencoding()) # 我测试了下是utf-8
源文件设置的编码: 如果想要在源码中写非ASCII文字,可以在源码文件开头写入一行:
# coding: utf-8
终端编码: 终端显示的时候,若无法更改终端编码格式的话,需要提前将打印内容转换为终端支持的编码格式。
# 文件读写编码 |
文件读写时,read()
出来的文件内容,得到的就是str
类型的,write()
写入文件时,也要保证写入类型为str
。
f = open('test.txt', 'r')
content = f.readlines() # 得到列表格式的数据
f.close
print(type(content[0])) # <class 'str'>