Domanda

Come si converte una stringa Unicode (contenente caratteri extra come & # 163; $, ecc.) in una stringa Python?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top