从str到unicode的python编码

时间:2014-04-07 09:32:14

标签: python django unicode encoding

我'一个非常简单的环境:

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

2 个答案:

答案 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。也许您正在使用其他编码,而且您必须找出它是什么。