可能有两个原因:
- 你的数据编码不是 utf8 ;
- 你处理数据时,破坏了数据的完整性;
第一个原因就不说,你换成正确的编码即可。
第二个原因举个例子,对于合法的UTF8编码文本,可以成功解码:
>>> data = '中国'.encode('utf8')
>>> data.decode('utf8')
'中国'
如果因为某种原因,UTF8文本少了一个字节或者某个字节错掉了,解码时就会抛锚:
>>> data[1:].decode('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 0: invalid start byte
这时,你可以选择在解码中忽略错误:
>>> data[1:].decode('utf8', errors='ignore')
'国'
或者将不可识别的字符替换成一个问号,以便定位UTF8字节流问题位置:
>>> data[1:].decode('utf8', errors='replace')
'??国'
更多关于文本编码的细节介绍,可以参考我先前写的文章:一文说清文本编码那些事
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…