2014-07-04 12 views
5

Ho una stringa in formato UTF-8 ma non sono sicuro di come convertire questa stringa nel relativo carattere letterale corrispondente. Per esempio io ho la stringa:Converti UTF-8 in stringhe letterali in Python

mia stringa è: 'Entre\xc3\xa9'

Esempio uno:

Questo codice:

u'Entre\xc3\xa9'.encode('latin-1').decode('utf-8') 

restituisce il risultato: u'Entre\xe9'

Se dunque io continuo stampando questo:

print u'Entre\xe9' 

ottengo il risultato: Entreé

Questo è grande e vicino a quello che mi serve. Il problema è che non riesco a rendere 'Entre \ xc3 \ xa9' una variabile e a passarla attraverso i passaggi in questo momento si rompe. Qualche consiglio per farlo funzionare?

Esempio:

a = 'Entre\xc3\xa9' 
b = 'u'+ a.encode('latin-1').decode('utf-8') 
c= 'u'+ b 

desidero risultato di "c" per essere:

Entreé 

risposta

8

La sintassi u''funziona solo per stringhe, ad esempio definizione dei valori nel codice sorgente. L'uso della sintassi produce un oggetto unicode creato, ma non è l'unico modo per creare tale oggetto.

Non è possibile creare un valore unicode da una stringa di byte aggiungendo u di fronte ad esso. Ma se hai chiamato str.decode() con la codifica giusta, ottieni il valore unicode. Viceversa, è possibile codificareunicode oggetti con stringhe di byte con unicode.encode().

noti che quando si visualizza un oggetto unicode, Python rappresenta esso utilizzando nuovamente la sintassi letterale stringa Unicode (così u'...'), per facilitare il debugging. È possibile incollare nuovamente la rappresentazione in un interprete Python e ottenere un oggetto con lo stesso valore.

Il vostro valore a viene definita utilizzando una stringa di byte letterali, in modo che solo bisogno di decodificare:

a = 'Entre\xc3\xa9' 
b = a.decode('utf8') 

Il tuo primo esempio creato una Mojibake, una stringa Unicode contenente Latin-1 codepoints che in realtà rappresentano UTF-8 byte. Questo è il motivo per cui è necessario prima eseguire la codifica in Latin-1 (per annullare il Mojibake), quindi decodificare da UTF-8.

Si consiglia di leggere su Python e Unicode in Unicode HOWTO.Altri articoli di interesse sono:

+0

Molte grazie! Così ora se entro: b nell'interprete python ottengo: u'Entre \ xe9' Se entro: stampa b ottengo: entrée E 'possibile avere una variabile stringa che tornerà automaticamente Entrée senza usare la dichiarazione di stampa? – Tminer

+0

@ user3804963: Penso che tu stia confondendo la rappresentazione ('u'Entre \ xe9'') con il valore. 'print' mostra il valore (come codificato per il tuo terminale), mentre la tua console python ti mostra la rappresentazione (per il debug). Nessun cambiamento di valore ha avuto luogo. Python ti mostra un valore che può essere copiato e incollato nel codice sorgente senza dover dichiarare una codifica del codice sorgente oltre l'ASCII predefinito, quindi viene mostrata una sequenza di escape ('\ xe9') per il punto di codice Unicode U + 00E9. **E 'normale**. –