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

时间:2015-01-19 17:33:06

标签: python encoding utf-8

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

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如何让脚本继续工作时会产生特殊字符?

NB。我是一个python noob

1 个答案:

答案 0 :(得分:1)

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将编码为终端使用的编解码器。