Converti una stringa Unicode in una stringa in Python (contenente simboli extra)


504

Come si converte una stringa Unicode (contenente caratteri extra come £ $, ecc.) In una stringa Python?


2
Dobbiamo sapere quale versione di Python stai usando e come stai chiamando una stringa Unicode. Effettuare quanto segue su un breve Unicode_string che include i simboli di valuta che causano il disturbo: Python 2.x: print type(unicode_string), repr(unicode_string)Python 3.x: print type(unicode_string), ascii(unicode_string)quindi modificare la domanda e copiare / incollare i risultati dell'istruzione di stampa sopra. NON ridigitare i risultati. Cerca anche nella parte superiore del codice HTML e vedi se riesci a trovare qualcosa del genere: <meta http-equiv = "Content-Type" content = "text / html; charset = iso-8859
John Machin

3
Dubito che ricevi unicode da una richiesta web. È possibile ottenere Unicode codificato UTF-8.

28
@lutz: in che modo esattamente "Unicode codificato UTF-8" non è Unicode?
jalf

2
Dovresti davvero chiarire cosa intendi con stringa unicode e stringa python (dare esempi concreti sarebbe il migliore immagino) come è chiaro dai commenti ci sono diverse interpretazioni della tua domanda. Mi chiedo perché non l'hai fatto, anche se sono passati più di 3,5 anni da quando hai fatto questa domanda.
Piotr Dobrogost,

6
@jalf: se è codificato ; non è più Unicode ad esempio,unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
jfs il

Risposte:


573

Vedere unicodedata.normalize

title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii', 'ignore')
'Kluft skrams infor pa federal electoral groe'

24
+1 risponde alla domanda come formulata, il problema di @ williamtroup di non riuscire a salvare unicode in un file suona come un problema completamente diverso degno di una domanda separata
Mark Roddy,

5
@John - questa risposta precede il chiarimento del PO.
Dominic Rodger,

10
@Mark Roddy: La sua domanda scritta è come convertire una "stringa Unicode" (qualunque cosa voglia dire) contenente alcuni simboli di valuta in una "stringa Python" (qualunque cosa ...) e pensi che rimuova alcuni segni diacritici i caratteri delete-other-non-ascii kludge risponde alla sua domanda ???
John Machin,

13
@JohnMachin Questo risponde alla domanda parola per parola: L' unico modo per convertire una unicodestringa in a strè di eliminare o convertire i caratteri che non possono essere rappresentati in ASCII. Quindi +1 da me.
Izkata,

4
@lzkata: no, non lo è. type(title) == unicode and type(title.encode('utf-8')) == str. Non è necessario corrompere l'input, per ottenere un bytestring che può essere salvato in un file.
jfs

319

È possibile utilizzare la codifica in ASCII se non è necessario tradurre i caratteri non ASCII:

>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>

4
Risposta fantastica. Esattamente quello di cui avevo bisogno. Inoltre, un'ottima presentazione per mostrare l'effetto del ignorevsreplace
Jonny Brooks l'

o a.encode('ascii', 'xmlcharrefreplace')'aaa&#224;&#231;&#231;&#231;&#241;&#241;&#241;'.
Bob Stein,

type(a)è strin Python 3.6.8 e non ha alcun encode()metodo.
Ali Tou,

138
>>> text=u'abcd'
>>> str(text)
'abcd'

Se la stringa contiene solo caratteri ASCII.


18
Funzionerebbe solo su Windows. E si romperà se ci sono simboli non ascii.
Vanuan,

6
Ciò si interrompe se il contenuto della stringa è effettivamente unicode, non solo caratteri ASCII in una stringa unicode. Non farlo, otterrai eccezioni casuali UnicodeEncodeError dappertutto.
Doug,

11
Questa risposta mi ha aiutato. Se sai che la tua stringa è ascii e devi ricollegarla a una stringa non unicode, questo è molto utile.
VedTopkar,

113

Se si dispone di una stringa Unicode e si desidera scriverla in un file o in un altro modulo serializzato, è necessario prima codificarlo in una rappresentazione particolare che può essere memorizzata. Esistono diverse codifiche Unicode comuni, come UTF-16 (utilizza due byte per la maggior parte dei caratteri Unicode) o UTF-8 (1-4 byte / punto di codice in base al carattere), ecc. Per convertire quella stringa in una particolare codifica, è necessario poter usare:

>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'

Questa stringa non elaborata di byte può essere scritta in un file. Tuttavia, si noti che durante la lettura, è necessario sapere in quale codifica si trova e decodificarlo utilizzando la stessa codifica.

Quando si scrive su file, è possibile eliminare questo processo di codifica / decodifica manuale utilizzando il modulo codecs . Quindi, per aprire un file che codifica tutte le stringhe Unicode in UTF-8 , utilizzare:

import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string)  # Stored on disk as UTF-8

Nota che qualsiasi altra cosa che sta usando questi file deve capire in che codifica si trova il file se vogliono leggerli. Se sei l'unico a leggere / scrivere questo non è un problema, altrimenti assicurati di scrivere in una forma comprensibile da qualunque altra cosa usi i file.

In Python 3, questa forma di accesso ai file è l'impostazione predefinita e la openfunzione integrata accetta un parametro di codifica e traduce sempre in / da stringhe Unicode (l'oggetto stringa predefinito in Python 3) per i file aperti in modalità testo.


58

Ecco un esempio:

>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'

1
Qualcuno può spiegare perché, quando codifico il simbolo dell'euro utf8come mostrato qui, il risultato sono solo punti interrogativi? Ecco un'immagine del mio Python, versione 2.7.13. (Posso codificare altri oggetti unicode come u"Klüft", ma non gli euro?)
The Red Pea

5

Bene, se sei disposto / pronto a passare a Python 3 (che potrebbe non essere dovuto all'incompatibilità all'indietro con un codice Python 2), non devi effettuare alcuna conversione; tutto il testo in Python 3 è rappresentato con stringhe Unicode, il che significa anche che non c'è più uso della u'<text>'sintassi. Hai anche quelle che sono, in effetti, stringhe di byte, che sono usate per rappresentare i dati (che possono essere una stringa codificata).

http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

(Naturalmente, se stai attualmente utilizzando Python 3, è probabile che il problema abbia a che fare con il modo in cui stai tentando di salvare il testo in un file.)


2
In Python 3 le stringhe sono stringhe Unicode. Non sono mai codificati. Ho trovato utile il seguente testo: joelonsoftware.com/articles/Unicode.html

Vuole salvarlo in un file; in che modo la tua risposta ti aiuta?
John Machin,

@lutz: giusto, avevo dimenticato che Unicode è una mappa di caratteri piuttosto che una codifica. @John: al momento non ci sono abbastanza informazioni per sapere quale sia il problema con il salvataggio. Sta ricevendo un errore? Non sta riscontrando errori, ma quando apre il file esternamente ottiene mojibake? Senza tali informazioni, ci sono troppe possibili soluzioni che potrebbero essere fornite.
JAB

@Cat: Al momento non ci sono informazioni per sapere cosa ha, per non parlare del suo problema di salvataggio. Gli ho chiesto di fornire alcuni fatti - vedi la mia risposta.
John Machin,

5

Ecco un esempio di codice

import unicodedata    
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')

in che modo questa risposta è diversa dalla risposta accettata?
sgauri,

3

il file contiene una stringa con escape unicode

\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",

per me

 f = open("56ad62-json.log", encoding="utf-8")
 qq=f.readline() 

 print(qq)                          
 {"log":\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f\"}

(qq.encode().decode("unicode-escape").encode().decode("unicode-escape")) 
# '{"log":"message": "Авторизация пользователя"}\n'

2
ha funzionato anche se uso solo:result.encode().decode('unicode-escape')
Ammad Khalid il

0

Nessuna risposta ha funzionato per il mio caso, in cui avevo una variabile stringa contenente caratteri unicode e nessuna codifica-decodifica spiegata qui ha funzionato.

Se lo faccio in un terminale

echo "no me llama mucho la atenci\u00f3n"

o

python3
>>> print("no me llama mucho la atenci\u00f3n")

L'output è corretto:

output: no me llama mucho la atención

Ma lavorare con gli script che caricano questa variabile stringa non ha funzionato.

Questo è ciò che ha funzionato sul mio caso , nel caso in cui qualcuno aiuti:

string_to_convert = "no me llama mucho la atenci\u00f3n"
print(json.dumps(json.loads(r'"%s"' % string_to_convert), ensure_ascii=False))
output: no me llama mucho la atención

devi importare json
pctripsesp il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.