Python ASCII和Unicode解码错误

时间:2012-07-18 15:09:48

标签: python string sqlite character-encoding

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

  

Python无法解码字节字符,期待unicode“

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

string = string.encode("utf8")

我收到以下错误:

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

我一直在为这个错误而死!我该如何解决?

5 个答案:

答案 0 :(得分:49)

你需要采取严谨的方法。 Pragmatic Unicode, or How Do I Stop The Pain?拥有您需要的一切。

如果你在那行代码上得到了那个错误,那么问题是string是一个字节字符串,而Python 2则隐式地尝试将它解码为Unicode。但它不是纯粹的ascii。您需要知道编码是什么,并正确解码。

答案 1 :(得分:12)

应在encode个对象上使用unicode方法将它们转换为具有给定编码的str对象。应该在给定编码的decode个对象上使用str方法来转换它们unicode个对象。

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

答案 2 :(得分:5)

编辑:正如你从downvotes中看到的,这不是最好的方法。一个优秀的,强烈推荐的答案是在此之后,所以如果您正在寻找一个好的解决方案,请使用它。这是一个破解性的解决方案,在以后的某个时候对你不友善。

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

的示例
>>> 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'

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

编辑:

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

答案 3 :(得分:2)

0xE3代码点是一个带有波形符号的'a'。您的原始字符串很可能已经是UTF-8,因此您无法使用默认的ASCII字符集对其进行解码。

答案 4 :(得分:0)

python 2.7中的

字符串是一个ecoded字符串(主要用ASCII编码),但不是字符串或unicode。

因此,当你执行string.encode(&#39;某些编码&#39;)时,你实际上正在编码一个编码字符串(使用一些编码)

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')