解码函数尝试对Python进行编码

解码函数尝试对Python进行编码,python,unicode,unicode-escapes,Python,Unicode,Unicode Escapes,我试图打印一个unicode字符串,其中没有特定的十六进制编码。我从facebook上获取这些数据,它在UTF-8的html头中有一个编码类型。当我打印类型时,它显示为unicode,但当我尝试使用unicode escape对其进行解码时,它显示存在编码错误。当我使用解码方法时,为什么它试图编码 代码 a='unicode html文本的非常长的字符串,我不会重新打印' 打印类型(a) >>> 打印a.decode('unicode-escape') >>>回溯(最近一次呼叫最后一次)

我试图打印一个unicode字符串,其中没有特定的十六进制编码。我从facebook上获取这些数据,它在UTF-8的html头中有一个编码类型。当我打印类型时,它显示为unicode,但当我尝试使用unicode escape对其进行解码时,它显示存在编码错误。当我使用解码方法时,为什么它试图编码

代码

a='unicode html文本的非常长的字符串,我不会重新打印'
打印类型(a)
>>>    
打印a.decode('unicode-escape')
>>>回溯(最近一次呼叫最后一次):
myFunctionPage中第203行的文件“scfbp.py”
打印a.decode('unicode-escape')
UnicodeEncodeError:“ascii”编解码器无法对1945位置的字符u'\u20ac'进行编码:序号不在范围内(128)

失败的不是解码。这是因为您正在尝试向控制台显示结果。使用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) >>>a=u'包含\\u20ac和其他一些文本的非常长的字符串' >>>类型(a) >>>a.decode('unicode-escape') u'包含\u20ac和其他一些文本的非常长的字符串' >>>打印a.decode('unicode-escape') 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 UnicodeEncodeError:“ascii”编解码器无法对位置30处的字符u'\u20ac'进行编码:序号不在范围内(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) >>>a=u'包含\u20ac和其他一些文本的非常长的字符串' >>>类型(a) >>>a.decode('unicode-escape') 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 UnicodeEncodeError:“ascii”编解码器无法对位置30处的字符u'\u20ac'进行编码:序号不在范围内(128)
当您打印到控制台时,Python尝试将字符串编码(转换)为终端的字符集。如果这不是UTF-8,或者没有映射字符串中的所有字符,它将发出呜呜声并抛出异常

当我快速处理数据时,有时会遇到这种情况,比如土耳其字符

如果您通过Windows命令提示符运行python.exe,您可以在此处找到一些解决方案:。基本上,您可以使用
chcp
更改代码页,但这相当麻烦。我会跟随并使用类似IDLE的东西

>>> print type(a)
<type 'unicode'>
>>> a.decode('unicode-escape')
请记住:Unicode不是一种编码。其他的都是,比如ascii,utf8,拉丁-1等等


顺便说一句,这种隐式编码在Python3中已经消失了,因为它使人困惑。

这不是他出错的原因。他正试图解码一个unicode对象。由于您将二进制数据解码为unicode数据,因此Python 2将首先对其进行编码,这是使用ascii编解码器实现的。这就是失败的地方。@Lennart Regebro:实际上我怀疑他的字符串的实际类型是
str
,而不是
unicode
。看看他是如何初始化字符串的-注意没有
u
。我认为他拥有的不是unicode字符串,而是unicode转义字符串(不一样!)。他正试图将其解码为unicode。如果我的理论是正确的,那么我认为这个答案实际上是正确的。@Mark Byers:是的,这是不一致的,但缺少u比键入错误的类型更容易。:)错误与他所做的是一致的。如果你解码一个unicode对象,你会得到一个编码错误。@Lennart:但他也使用decode而不是encode,这意味着他是从str开始的,而不是unicode。而且错误信息和我的答案是一致的,不是吗?但我同意这个问题令人难以置信地困惑,而且遗漏了重要信息。@Lennart Regebro:我在回答中补充了一些细节。如您所见,根据原始字符串是包含unicode字符还是unicode转义码,错误消息可能是两种完全不同的情况之一的结果。我不认为你更能说出哪个是“正确”的答案——只有OP知道这一点。但考虑到他问题中的所有信息,我个人认为最有可能的解释是我最初给出的解释。我不认为仅仅根据问题中的信息就有足够的证据证明我的答案是错误的。
>>> print type(a)
<type 'unicode'>
>>> a.decode('unicode-escape')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2110' in position 3: ordinal not in range(128)