2011-01-25 92 views
7

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

代码

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) 

回答

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的解释器,那么你不会得到这个问题。


更新:请注意,这是不一样的少了一个反斜杠,它的解码过程中失败的situtation,但同样的错误信息:

 
>>> 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) 
+0

这不是他错误的原因。他正在尝试解码一个unicode对象。由于您从二进制数据解码为Unicode数据,因此Python 2将首先*编码*它,它使用ascii编解码器进行编码。这就是失败。 – 2011-01-26 11:49:43

+0

@Lennart Regebro:其实我怀疑他的字符串的实际类型是`str`,而不是`unicode`。看看他如何初始化字符串 - 注意没有`u`。我认为他所拥有的不是一个unicode字符串,而是一个* unicode-escaped *字符串(不一样!)。这是他试图解码unicode。如果我的理论是正确的,那么我认为这个答案其实是正确的。 – 2011-01-26 11:55:54

3

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

当我做数据的快速处理时,例如土耳其文字符,我时不时会遇到这种情况。

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

1
>>> 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中不存在,因为它混淆了人。