hai chiesto (in un commento) "" "Questo è ciò che mi ha sconcertante Come è andata da esso originale accentata a quello che è ora Quando si dice doppia codifica con utf8? e latin1, è un totale di 3 codifiche (2 utf8 + 1 latin1)? Qual è l'ordine della codifica dallo stato originale a quello attuale? "" "
Nella risposta di Mark Byers, dice" "" quello che sembra essere una codifica UTF-8 che è stata decodificata in modo errato "" ". Hai accettato la sua risposta. Ma sei ancora perplesso? OK, ecco la descrizione dettagliata:
Nota: Tutte le stringhe verranno visualizzate utilizzando (implicitamente) repr()
. unicodedata.name()
verrà utilizzato per verificare i contenuti. In questo modo, le variazioni nella codifica della console non possono confondere l'interpretazione delle stringhe.
Stato iniziale: si dispone di un oggetto Unicode che è stato denominato u1. Contiene e-acuta:
>>> u1 = u'\xe9'
>>> import unicodedata as ucd
>>> ucd.name(u1)
'LATIN SMALL LETTER E WITH ACUTE'
si codifica U1 come UTF-8 e il nome il risultato s:
>>> s = u1.encode('utf8')
>>> s
'\xc3\xa9'
a decodificare s utilizzando latin1 - CORRETTAMENTE; s è stato codificato usando utf8, NON latin1. Il risultato è spazzatura senza senso.
>>> u2 = s.decode('latin1')
>>> u2
u'\xc3\xa9'
>>> ucd.name(u2[0]); ucd.name(u2[1])
'LATIN CAPITAL LETTER A WITH TILDE'
'COPYRIGHT SIGN'
>>>
Vi prego di capire: unicode_object.encode('x').decode('y)
quando x = y è normalmente [vedi nota sotto] una sciocchezza; solleverà un'eccezione se sarai fortunato; se sei sfortunato creerà silenziosamente parole senza senso. Inoltre, ti preghiamo di comprendere che la creazione silenziosa del linguaggio non è un bug: non esiste un modo generale in cui Python (o qualsiasi altra lingua) possa rilevare che è stata commessa un'assurdità. Ciò si applica in particolare quando è coinvolto latin1, perché tutti i 256 codepoint eseguono il mapping 1 su 1 con i primi 256 codecoint Unicode, quindi è impossibile ottenere un UnicodeDecodeError da str_object.decode ('latin1').
Ovviamente, (si spera che sia anormale) potrebbe essere necessario annullare una tale assurdità facendo gibberish_unicode_object.encode('y').decode('x')
come suggerito in varie risposte alla tua domanda.
fonte
2010-05-07 12:48:10
Questa è la terza domanda che hai chiesto in meno di un giorno, il tutto basato sullo stesso equivoco. 'u'Andr \ xc3 \ xa9'' è un'assurdità ottenuta da una doppia codifica con utf8 e latin1. Basta non farlo! –
Questo è ciò che mi sta sconcertando. Come è andato dal suo accento originale a quello che è adesso? Quando dici doppia codifica con utf8 e latin1, è un totale di 3 codifiche (2 utf8 + 1 latin1)? Qual è l'ordine della codifica dallo stato originale a quello attuale? –