Pytałeś (w komentarzu) „” "To, co mnie zastanawiające Jak poszło z niego oryginalny akcentowany do tego, co jest teraz Kiedy mówisz podwójne kodowanie z UTF-8? i latin1, czy to w sumie 3 kodowania (2 utf8 + 1 latin1)? Jaka jest kolejność kodowania od stanu pierwotnego do bieżącego? "" "
W odpowiedzi Marka Byersa, mówi: "" wydaje się, że kodowanie UTF-8 zostało niepoprawnie zdekodowane "" ". Przyjąłeś odpowiedź. Ale nadal jesteś zdziwiony? OK, oto opis ciosu:
Uwaga: Wszystkie ciągi będą wyświetlane przy użyciu (domyślnie) repr()
. unicodedata.name()
zostanie użyty do sprawdzenia zawartości. W ten sposób warianty kodowania konsoli nie mogą mylić interpretacji napisów.
Stan początkowy: masz obiekt Unicode o nazwie u1. Zawiera e-ostra:
>>> u1 = u'\xe9'
>>> import unicodedata as ucd
>>> ucd.name(u1)
'LATIN SMALL LETTER E WITH ACUTE'
można zakodować U1 jako UTF-8 i S nazwać wynik:
>>> s = u1.encode('utf8')
>>> s
'\xc3\xa9'
dekodowania s przy użyciu latin1 - NIEWŁAŚCIWIE; s zostało zakodowane za pomocą utf8, NOT latin1. Rezultatem są bezsensowne śmieci.
>>> u2 = s.decode('latin1')
>>> u2
u'\xc3\xa9'
>>> ucd.name(u2[0]); ucd.name(u2[1])
'LATIN CAPITAL LETTER A WITH TILDE'
'COPYRIGHT SIGN'
>>>
Proszę zrozumieć: unicode_object.encode('x').decode('y)
gdy x = y jest zwykle [patrz uwaga poniżej] nonsens; podniosą wyjątek, jeśli będziesz miał szczęście; jeśli masz pecha, będzie to cicho tworzyć bełkot. Należy również zrozumieć, że tworzenie cichego bełkotu nie jest błędem - nie ma żadnego ogólnego sposobu, w jaki Python (lub jakikolwiek inny język) mógłby wykryć, że popełniono bzdury. Dotyczy to w szczególności sytuacji, w której występuje łacińska1, ponieważ wszystkie 256 punktów współrzędnych mapuje 1 na 1 z pierwszymi 256 punktami kodowymi Unicode, więc niemożliwe jest uzyskanie UnicodeDecodeError z str_object.decode ("latin1").
Oczywiście, nienormalnie (ma się nadzieję, że jest nienormalny), być może trzeba cofnąć takie bzdury, wykonując gibberish_unicode_object.encode('y').decode('x')
, jak sugerowano w różnych odpowiedziach na twoje pytanie.
To jest TRZECIE pytanie, o które prosiłeś w mniej niż jeden dzień, a wszystko opiera się na tym samym nieporozumieniu. 'u'Andr \ xc3 \ xa9'' jest nonsensem uzyskanym przez podwójne kodowanie z utf8 i latin1. Tylko tego nie rób! –
To właśnie mnie zastanawia. Jak to się stało, od oryginalnego akcentu do tego, czym jest teraz? Kiedy mówisz o podwójnym kodowaniu z utf8 i latin1, czy jest to w sumie 3 kodowanie (2 utf8 + 1 latin1)? Jaka jest kolejność kodowania od stanu pierwotnego do bieżącego? –