Converti una stringa Unicode in una stringa in Python (contenente simboli extra)
-
05-07-2019 - |
Domanda
Come si converte una stringa Unicode (contenente caratteri extra come & # 163; $, ecc.) in una stringa Python?
Soluzione
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'
Altri suggerimenti
È 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???????'
>>>
>>> text=u'abcd'
>>> str(text)
'abcd'
Se la stringa contiene solo caratteri ASCII.
Se si dispone di una stringa Unicode e si desidera scriverla in un file o in un altro modulo serializzato, è necessario prima codificare 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 può 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, tieni presente che quando lo rileggi, devi sapere in quale codifica è presente e decodificarlo utilizzando la stessa codifica.
Quando si scrive su file, è possibile eliminare questo processo di codifica / decodifica manuale utilizzando i codec modulo. 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 quale 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 funzione integrata open
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.
Ecco un esempio:
>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'
Bene, se sei disposto / pronto a passare a Python 3 (che potrebbe non essere dovuto all'incompatibilità all'indietro con alcuni codici 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 sintassi u'<text>'
. 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
(Ovviamente, 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.)
Ecco un esempio di codice
import unicodedata
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')
import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars