在将某个字符串插入数据库时,我遇到了非常令人沮丧的错误。它说的是:
Python无法解码字节字符,期待unicode“
经过大量搜索,我发现我可以通过将我的字符串编码为Unicode来克服此错误。我尝试首先解码字符串,然后以UTF-8格式对其进行编码。像:
string = string.encode("utf8")
我收到以下错误:
'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128)
我一直在为这个错误而死!我该如何解决?
答案 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)
我感觉到你的痛苦,我在同样的错误中遇到了很多问题。我解决它的最简单的方法(这可能不是最好的方式,它取决于你的应用程序)是将事物转换为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)
字符串是一个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')