unicode_escape
将输入视为Latin-1编码;任何不代表Python字符串文字转义序列的字节都将解码的映射字节直接解码为Unicode码点。你把它UTF-8字节,所以西里尔字符表示与各2个字节,其中解码的两个Latin-1的每一个字符,其中一个是U + 00D0 Ð
,其他不可打印:
>>> print repr('АБВ\\u003d\\"res')
'\xd0\x90\xd0\x91\xd0\x92\\u003d\\"res'
>>> print repr('АБВ\\u003d\\"res'.decode('latin1'))
u'\xd0\x90\xd0\x91\xd0\x92\\u003d\\"res'
>>> print 'АБВ\\u003d\\"res'.decode('latin1')
ÐÐÐ\u003d\"res
这种的误解码被称为Mojibake,并且可以通过重新编码被修复以拉丁语-1,然后从正确的编解码器(UTF-8你的情况)进行解码:
>>> print 'АБВ\u003d\\"res'.decode('unicode_escape')
ÐÐÐ="res
>>> print 'АБВ\u003d\\"res'.decode('unicode_escape').encode('latin1').decode('utf8')
АБВ="res
注意,这将失败如果\uhhhh
转义序列对Latin-1范围之外的代码点进行编码(U + 0 000-U + 00FF)。
Python的3当量的上述用途codecs.encode()
:
>>> import codecs
>>> codecs.decode('АБВ\\u003d\\"res', 'unicode_escape').encode('latin1').decode('utf8')
'АБВ="res'
请向我们展示一个显示此行为的[mcve],其中包括您解码的原始值的'repr()'输出。 –
推测这是Python 2.7并且输入是一个*字节的字符串*?所以repr可以是''\ xd0 \ x90 \ xd0 \ x91 \ xd0 \ x92 \\ u003d \\'res''。 –
@MartijnPieters这个_is_是一个极小的例子。repr()输出是 'Ð\ x90 \ x91 \ x92 =“res” 不,这是Python 3. – Dariush