我'一个非常简单的环境:
In [64]: aa = '\xe1'
In [65]: aa
Out[65]: '\xe1'
In [66]: type(aa)
Out[66]: str
In [67]: u'\xe1'
Out[67]: u'\xe1'
In [68]: u'%s' % aa
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc
in <module>()
----> 1 u'%s' % aa
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe1 in position 0:
ordinal not in range(128)
我想做的就是将此 aa 字符串转换为unicode。我怎么能这样做?
在db i的unicode字符串中,使用str我可以&#39;如果包含特殊字符,则生成django查询。使用 .encode(&#39; utf-8&#39;)或 unicode(aa)我得到了相同的 UnicodeDecodeError 。
我也试过玩sys.setdefaultencoding
,然后它可能有用,但它会杀死其他一切。
Python版本:2.7.3
答案 0 :(得分:2)
如果使用不同的编码连接字符串,python使用ascii作为默认值来解码字符串。 在你的情况下,这显然是错误的编码。
您的aa
是一个unicode á
:
>>> print u'\xe1'
á
如果您将aa
作为unicode传递,它将起作用
>>> aa = u'\xe1'
>>> u'%s' % aa
u'\xe1'
>>> print u'%s' % aa
á
你不能将'\xe1'
作为utf-8,因为它在utf-8中无效,因此你无法解码它。
>>> '\xe1'.decode('utf-8')
...
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe1 in position 0: unexpected end of data
追溯中的重要部分是:unexpected end of data
。
答案 1 :(得分:1)
试试这个:
aa.decode('latin-1')
或
unicode('\xe1', 'latin-1')
&#39; \ XE1&#39; (225作为int)不是ascii的一部分,因此,为了将您的字符串转换为unicode实例,您必须指定原始字符串中使用的编码。
我的示例假设您的原始字符串是latin-1。也许您正在使用其他编码,而且您必须找出它是什么。