git UnicodeDecodeError:'utf-8'编解码器无法解码位置173310中的字节0xb 3:无效的起始字节

hk8txs48  于 5个月前  发布在  Git
关注(0)|答案(1)|浏览(71)

为了找到所有的作者,他们的总提交和他们的电子邮件ID,我从GitHub克隆了torvalds/Linux仓库,并从python3(版本3.7.3)脚本中运行了以下代码:

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


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

axkjgtzd

axkjgtzd1#

问题是,Linux提交历史很可能(当然,根据结果)包含在您正在检索的字段中没有UTF-8编码的数据。
最简单的方法是告诉Python忽略错误,并在调用decode时用替换字符替换那些会被破坏的utf-8序列:

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

字符串
这样做的主要问题是,它将丢弃原始字符,并在其位置插入Unicode替换字符(“")。
根据你正在做的事情,这就足够了(如果你只是想看看屏幕上的数据,这当然足够了)。
否则,如果出于历史或法律的原因而这样做是为了获取所有提交者名称,那么尝试猜测不在utf-8中的特定提交的原始编码将是很重要的--这将需要,例如,由要尝试的编码循环包围的try/except语句。(比如,按顺序尝试“utf-8”,然后是“latin 1”,以此类推。这种方法的缺点是,某些编码(latin 1本身,例如)不会产生错误,即使它是不正确的编码。名称将最终损坏。如果有少数情况下,这种情况发生-几十个或几百个情况下,可能值得手动修复,而不是试图获得算法来猜测每个情况的正确编码。(在找到一个破名字的正确拼写后,无论如何都可以解决所有后续出现的问题)。

相关问题