为什么 str.encode('utf-8') 在我的 python 脚本中产生 UnicodeDecodeError?

Why does str.encode('utf-8') produce UnicodeDecodeError in my python script?

当运行以下代码(只打印出文件名)时:

print filename

它抛出以下错误:

File "myscript.py", line 78, in __listfilenames
print filename
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 13: ordinal not in range(128)

因此,为了解决这个问题,我尝试将 print filename 更改为 print filename.encode('utf-8'),但这并没有解决问题。

脚本 在尝试读取文件名(例如 Coé.jpg.

时失败

知道如何修改 filename 以便脚本在遇到特殊字符时继续工作吗?

注意。我是 python 菜鸟

filename 已经编码。已经是字节串了,不需要再编码.

但是由于您要求对其进行编码,Python 首先必须为您解码,而且它只能使用默认的 ASCII 编码来做到这一点。隐式解码失败:

>>> 'Coé.jpg'
'Co\xc3\xa9.jpg'
>>> 'Coé.jpg'.decode('utf8')
u'Co\xe9.jpg'
>>> 'Coé.jpg'.decode('utf8').encode('utf8')
'Co\xc3\xa9.jpg'
>>> 'Coé.jpg'.encode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2: ordinal not in range(128)

如果你想要编码的字节串,你根本不需要做任何编码。删除 .encode('utf8').

您可能需要阅读 Python 和 Unicode。我推荐:

经验法则是:尽早解码,尽可能晚编码。这意味着当您接收数据时,解码为 Unicode 对象,当您需要将该信息传递给其他对象时,仅在那时进行编码。许多 API 可以将解码和编码作为其工作的一部分;例如,print 将编码为终端使用的编解码器。