13

将某个字符串插入我的数据库时,我遇到了这个非常令人沮丧的错误。它说的是:

Python 无法解码字节字符,需要 unicode”

经过大量搜索,我发现可以通过将字符串编码为Unicode来克服此错误。我尝试通过首先解码字符串然后以UTF-8格式对其进行编码来做到这一点。像:

string = string.encode("utf8")

我收到以下错误:

'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128)

我一直死于这个错误!我如何解决它?

4

5 回答 5

50

你需要采取有纪律的方法。 实用的 Unicode,或者我如何停止痛苦?拥有您需要的一切。

如果您在该代码行上收到该错误,那么问题在于这string是一个字节字符串,而 Python 2 正在隐式尝试为您将其解码为 Unicode。但它不是纯ASCII。您需要知道编码是什么,并正确解码。

于 2012-07-18T15:12:47.733 回答
12

encode方法应用于unicode对象以将它们转换为str具有给定编码的对象。该decode方法应该用于str给定编码的对象以将它们转换为unicode对象。

我想您的数据库以 UTF-8 存储字符串。因此,当您从数据库中获取字符串时,请unicode通过str.decode('utf-8'). 然后只unicode在你的 python 程序中使用对象(文字用 定义u'unicode string')。在将它们存储到数据库之前,将它们转换为str带有uni.encode('utf-8').

于 2012-07-18T15:15:25.990 回答
5

编辑:正如您从反对票中看到的那样,这不是最好的方法。紧随其后的是一个极好的且强烈推荐的答案,因此,如果您正在寻找一个好的解决方案,请使用它。这是一个 hackish 解决方案,以后不会对您友好。

我感觉到你的痛苦,我遇到了很多同样的错误。我解决它的最简单方法(这可能不是最好的方法,这取决于您的应用程序)是将事物转换为 unicode,并忽略错误。这是Unicode HOWTO - Python v2.7.3 文档中的一个示例

>>> unicode('\x80abc', errors='strict')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0:
                    ordinal not in range(128)
>>> unicode('\x80abc', errors='replace')
u'\ufffdabc'
>>> unicode('\x80abc', errors='ignore')
u'abc'

虽然这可能不是最方便的方法,但这是一种对我有用的方法。

编辑:

评论中的几个人提到这是一个坏主意,即使提问者接受了答案。这不是一个好主意,如果您要处理欧洲和重音字符,它会搞砸的。但是,如果它不是生产级代码,如果它是您正在处理的个人项目,并且您需要快速修复以使事情顺利进行,那么您可以使用它。您最终将需要使用正确的方法来修复它,这些方法在下面的答案中提到。

于 2012-07-18T15:19:06.507 回答
2

0xE3 代码点是 Unicode 中带有波浪号的“a”。您的原始字符串很可能已经采用 UTF-8 格式,因此您无法使用默认的 ASCII 字符集对其进行解码。

于 2012-07-18T15:12:33.860 回答
0

python 2.7 中的字符串是一个编码字符串(主要以 ASCII 编码),但不是字符串或 unicode。

因此,当您执行 string.encode('some encoding') 时,您实际上是在对编码字符串进行编码(使用某种编码)

Python 必须首先使用默认编码(python 2.7 中的 ASCII)解码该字符串,然后再进一步编码。您的字符串不是以 ASCII 编码,而是以其他一些编码(UTF8、LATIN-1 ..)编码的,因此当 python 尝试使用 ASCII 对其进行解码时,它会引发错误,因为ASCII 编解码器无法解码给定字符串中的少数字符ASCII 范围 (0 - 127)

#to encode above given string, first decode that using some encoding
decoded_string = string.decode('utf8')
#now encode that decoded string
decoded_string.encode('utf8')
于 2018-05-31T14:45:12.833 回答