解码函数尝试编码Python

时间:2011-01-25 23:14:45

标签: python unicode unicode-escapes

我正在尝试打印一个没有特定编码十六进制的unicode字符串。我从facebook获取这些数据,在UTF-8的html标题中有一个编码类型。当我打印类型 - 它说它的unicode,但是当我尝试使用unicode-escape解码它时说有一个编码错误。为什么我在使用解码方法时会尝试编码?

代码

a='really long string of unicode html text that i wont reprint'
print type(a)
 >>> <type 'unicode'>   
print a.decode('unicode-escape')
 >>> Traceback (most recent call last):
  File "scfbp.py", line 203, in myFunctionPage
    print a.decode('unicode-escape')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 1945: ordinal not in range(128)

3 个答案:

答案 0 :(得分:8)

这不是解码失败。这是因为您正在尝试将结果显示到控制台。使用print时,它使用默认编码ASCII编码字符串。不要使用打印,它应该工作。

>>> a=u'really long string containing \\u20ac and some other text'
>>> type(a)
<type 'unicode'>
>>> a.decode('unicode-escape')
u'really long string containing \u20ac and some other text'
>>> print a.decode('unicode-escape')
Traceback (most recent call last):
  File "<stdin>", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 30: ordinal not in range(128)

我建议使用IDLE或其他可以输出unicode的解释器,然后你就不会遇到这个问题了。


更新:请注意,这与减少反斜杠的情况不同,它在解码过程中失败,但出现相同的错误消息:

>>> a=u'really long string containing \u20ac and some other text'
>>> type(a)
<type 'unicode'>
>>> a.decode('unicode-escape')
Traceback (most recent call last):
  File "<stdin>", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 30: ordinal not in range(128)

答案 1 :(得分:3)

当您打印到控制台时,Python会尝试将字符串编码(转换)为终端的字符集。如果这不是UTF-8,或者没有映射字符串中所有字符的东西,它会发出异常并抛出异常。

当我快速处理数据时,我不时会遇到困扰,例如土耳其语字符。

如果您通过Windows命令提示符运行python.exe,可以在此处找到一些解决方案:What encoding/code page is cmd.exe using。基本上你可以用chcp更改代码页,但这很麻烦。我会关注Mark's advice并使用像IDLE这样的东西。

答案 2 :(得分:2)

>>> print type(a)
<type 'unicode'>
>>> a.decode('unicode-escape')
  

为什么我在使用解码方法时会尝试编码?

因为您将解码为 Unicode,并且您从编码。您刚刚尝试将unicode字符串解码为unicode。然后它做的第一件事是尝试使用ascii编解码器将其转换为字符串。这就是你得到的原因:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2110' in position 3: ordinal not in range(128)

请记住:Unicode不是编码。其他一切都像ascii,utf8,latin-1等。

这种隐式编码在Python 3中消失了,顺便说一下,因为它让人感到困惑。