Вы спросили (в комментарии): "" "Это то, что меня озадачивает. Как все вышло с оригинального акцентирования на то, что есть сейчас?(2 utf8 + 1 latin1)? Каков порядок кодирования из исходного состояния в текущее? "" "
В ответе Марка Байерса он говорит:" "кодировка UTF-8, которая была неправильно декодирована "" ".Вы приняли его ответ.Но вы все еще озадачены?Хорошо, вот подробное описание:
Примечание. Все строки будут отображаться с использованием (неявно) repr()
.unicodedata.name()
будет использоваться для проверки содержимого.Таким образом, изменения в кодировке консоли не могут запутать интерпретацию строк.
Исходное состояние: у вас есть объект Unicode, который вы назвали u1.Он содержит e-sharp:
>>> u1 = u'\xe9'
>>> import unicodedata as ucd
>>> ucd.name(u1)
'LATIN SMALL LETTER E WITH ACUTE'
Вы кодируете u1 как UTF-8 и называете результат s:
>>> s = u1.encode('utf8')
>>> s
'\xc3\xa9'
Вы декодируете s, используя latin1 - НЕПРАВИЛЬНО;s был закодирован с использованием utf8, а не latin1.Результат - бессмысленный мусор.
>>> u2 = s.decode('latin1')
>>> u2
u'\xc3\xa9'
>>> ucd.name(u2[0]); ucd.name(u2[1])
'LATIN CAPITAL LETTER A WITH TILDE'
'COPYRIGHT SIGN'
>>>
Пожалуйста, поймите: unicode_object.encode('x').decode('y)
, когда x! = Y обычно [см. Примечание ниже], глупость;это вызовет исключение, если вам повезет;если вам не повезет, это тихо создаст бред.Также, пожалуйста, поймите, что тихое создание тарабарщины не является ошибкой - нет общего способа, которым Python (или любой другой язык) может обнаружить, что ерунда была совершена.Это особенно применимо, когда задействован latin1, потому что все 256 кодовых точек отображаются с 1 на 1 с первыми 256 кодовыми точками Unicode, поэтому невозможно получить UnicodeDecodeError из str_object.decode ('latin1').
Конечно,ненормально (можно надеяться, что оно ненормально), вам, возможно, придется обратить вспять такую ерунду, выполнив gibberish_unicode_object.encode('y').decode('x')
, как предлагается в различных ответах на ваш вопрос.