Python-“ascii”编解码器无法通过

2024-04-19 18:55:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我真的很困惑。我试图编码,但错误是can't decode...

>>> "你好".encode("utf8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

我知道如何避免字符串上带有“u”前缀的错误。我只是想知道为什么在调用encode时错误是“无法解码”。Python在引擎盖下做什么?


Tags: inmost编码错误stdinlineutf8call
3条回答

您可以试试这个

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

或者

您也可以尝试以下操作

在.py文件顶部添加以下行。

# -*- coding: utf-8 -*- 

始终编码从unicode到字节。
在这个方向上,您可以选择编码。

>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好

另一种方法是将字节解码为unicode。
在这个方向上,您必须知道编码是什么。

>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好

这一点再强调也不为过。如果你不想玩unicode“打地鼠”,了解数据层发生了什么是很重要的。这里有另一种解释:

  • unicode对象已被解码,您永远不想对其调用decode
  • 一个bytestring对象已经被编码,您永远不想在它上调用encode

现在,当看到字节字符串上的.encode时,Python 2首先尝试将其隐式转换为文本(一个unicode对象)。类似地,当看到unicode字符串上的.decode时,Python 2会隐式地尝试将其转换为字节(一个str对象)。

这些隐式转换就是为什么在调用encode时可以获得UnicodeDecodeError。这是因为编码通常接受类型为unicode的参数;当接收到类型为str的参数时,在用另一种编码重新编码之前,会隐式解码为类型为unicode的对象。此转换选择默认的“ascii”解码器,给出编码器内部的解码错误。

实际上,在Python 3中,str.decodebytes.encode方法甚至都不存在。他们的撤换是为了避免这种常见的混乱。

…或任何编码中提到的;通常是“ascii”

"你好".encode('utf-8')

encode将unicode对象转换为string对象。但在这里,您已经在一个string对象上调用了它(因为您没有u)。所以python必须首先将string转换为unicode对象。所以它相当于

"你好".decode().encode('utf-8')

但是解码失败,因为字符串不是有效的ascii。这就是为什么你会抱怨无法解码。

相关问题 更多 >