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