UnicodeDecodeError:“ utf-8”编解码器无法解码位置173310中的字节0xb3:无效的起始字节

时间:2019-06-18 12:30:33

标签: python python-3.x git unicode utf-8

为了找到所有作者,提交总数和电子邮件ID,我从GitHub和python3(版本3.7.3)脚本中克隆了torvalds / linux存储库,并在其上运行了以下代码:

import subprocess
p = subprocess.Popen(['git shortlog -sne HEAD'], stdout=subprocess.PIPE, shell=True)
output = p.communicate()[0]
p.wait()
print(output.decode().split('\n')) #Decoding the byte string and splitting to get a python list of result lines.

并出现以下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 173310: invalid start byte

我不知道这是什么以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

问题是Linux提交历史记录很可能(肯定是给定结果)包含您在此处检索的字段中未经utf-8编码的数据。

最简单的方法是告诉Python忽略错误,并在调用decode时用替换字符替换会损坏的utf-8序列:

print(output.decode(encoding="utf-8", errors="replace").split('\n'))

主要问题是它将丢弃原始字符,并在其位置('�')插入Unicode替换字符。

根据您的操作,这就足够了(如果您只想查看屏幕上的数据,就足够了。)

否则,例如,如果出于历史或法律原因这么做以获取所有提交者名称,则重要的是,尝试猜测非utf-8的特定提交的原始编码,这很重要,例如,try / except语句被要尝试的编码循环包围(例如,按顺序尝试“ utf-8”,然后尝试“ latin1”,依此类推。这种方法的缺点是某些编码(latin1本身,对于例如)即使编码不正确也不会产生错误。名称最终会被弄乱。如果这种情况很少发生-几十或几百种情况,可能值得修复,然后手动而不是尝试以获得一种算法来猜测每种情况的正确编码(找到正确的拼写错误名称后,无论如何都将解决所有后续出现的问题)