在 Python 中操作文件或字符串时,有时候会碰到 UnicodeDecodeError 异常:
File "/usr/lib/python3.8/codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe5 in position 415632:
invalid continuation byte
当然,最开始需要检查的是编码是否符合文本自己的编码。目前默认编码都是utf8
,有时候我们需要指定编码为中文编码:
file = open(path, encoding="gbk")
b = s.encode(encoding="gbk")
s = b.decode(encoding="gbk")
但即使这样,有些文本还是会抛出 UnicodeDecodeError 错误,这是因为文件或者原来的二进制字节码本身就有错误,出现最多的情况是字节码被中间截断(比如一个中文有三个字节码,但因为某种原因最后一个字节码丢失了)。这时候我们需要用到errors
参数。
该参数属于codecs, Python 的编码库和基类。open 函数, 字符串都使用了该编码器,因此都支持errors
参数。该参数支持下面三个取值:
值 | 含义 |
---|---|
'strict' | 出错时会抛出 UnicodeError。这也是该参数的默认值。 |
'ignore' | 忽略错误格式的数据并且不加进一步通知就继续执行。用户完全无法察觉。 |
'replace' | 使用适当的替换标记进行替换。出错时不会通知,不会抛出异常。但解码后的结果里会包含方块问号,提示这里有错误。 |
所以要想忽略编码问题,最佳方式是:
file = open(path, encoding="gbk", errors="replace")
b = s.encode(encoding="gbk", errors="replace")
s = b.decode(encoding="gbk", errors="replace")
Q. E. D.