为什么 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。我推荐:
Pragmatic Unicode 作者:内德·巴切尔德
经验法则是:尽早解码,尽可能晚编码。这意味着当您接收数据时,解码为 Unicode 对象,当您需要将该信息传递给其他对象时,仅在那时进行编码。许多 API 可以将解码和编码作为其工作的一部分;例如,print
将编码为终端使用的编解码器。
当运行以下代码(只打印出文件名)时:
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。我推荐:
Pragmatic Unicode 作者:内德·巴切尔德
经验法则是:尽早解码,尽可能晚编码。这意味着当您接收数据时,解码为 Unicode 对象,当您需要将该信息传递给其他对象时,仅在那时进行编码。许多 API 可以将解码和编码作为其工作的一部分;例如,print
将编码为终端使用的编解码器。