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'
unicode
stringa 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???????'
>>>
ignore
vsreplace
a.encode('ascii', 'xmlcharrefreplace')
dà 'aaaàçççñññ'
.
type(a)
è str
in 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 open
funzione 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'
utf8
come 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