我正在尝试打印一个没有特定编码十六进制的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)
答案 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中消失了,顺便说一下,因为它让人感到困惑。