Come si converte una stringa Unicode (contenente caratteri extra come £ $, ecc.) In una stringa Python?
unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
Come si converte una stringa Unicode (contenente caratteri extra come £ $, ecc.) In una stringa Python?
unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
Risposte:
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'
unicodestringa in a strè di eliminare o convertire i caratteri che non possono essere rappresentati in ASCII. Quindi +1 da me.
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.
È 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???????'
>>>
ignorevsreplace
a.encode('ascii', 'xmlcharrefreplace')dà 'aaaàçççñññ'.
type(a)è strin Python 3.6.8 e non ha alcun encode()metodo.
>>> 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 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.
Ecco un esempio:
>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'
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?)
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.)
Ecco un esempio di codice
import unicodedata
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')
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'
result.encode().decode('unicode-escape')
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
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