7

我正在尝试打印一个没有特定编码十六进制的 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)
4

3 回答 3

8

失败的不是解码。这是因为您试图将结果显示到控制台。当您使用 print 时,它使用默认编码(即 ASCII)对字符串进行编码。不要使用打印,它应该可以工作。

>>> a=u'非常长的字符串,包含 \\u20ac 和一些其他文本'
>>> 类型(一)
<类型'unicode'>
>>> a.decode('unicode-escape')
你真的很长的字符串包含 \u20ac 和一些其他文本'
>>> 打印 a.decode('unicode-escape')
回溯(最近一次通话最后):
  文件“<stdin>”,第 1 行,在
UnicodeEncodeError:'ascii' 编解码器无法在位置 30 编码字符 u'\u20ac':序数不在范围内(128)

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


更新:请注意,这与少一个反斜杠的情况不同,后者在解码过程中失败,但具有相同的错误消息:

>>> a=u'非常长的字符串,包含 \u20ac 和一些其他文本'
>>> 类型(一)
<类型'unicode'>
>>> a.decode('unicode-escape')
回溯(最近一次通话最后):
  文件“<stdin>”,第 1 行,在
UnicodeEncodeError:'ascii' 编解码器无法在位置 30 编码字符 u'\u20ac':序数不在范围内(128)
于 2011-01-25T23:17:32.713 回答
3

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

当我快速处理数据时,这会时不时地困扰我,例如其中包含土耳其语字符。

如果您通过 Windows 命令提示符运行 python.exe,您可以在此处找到一些解决方案:cmd.exe 使用什么编码/代码页。基本上您可以更改代码页,chcp但这很麻烦。我会听从Mark 的建议并使用 IDLE 之类的东西。

于 2011-01-25T23:20:38.210 回答
2
>>> print type(a)
<type 'unicode'>
>>> a.decode('unicode-escape')

为什么当我使用解码方法时它试图编码?

因为您解码Unicode,并且您. 您刚刚尝试将 unicode 字符串解码为 un​​icode。然后它做的第一件事是尝试使用 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 中消失了,因为它使人们感到困惑。

于 2011-01-26T11:48:19.477 回答