Dov'è il database "ASCII migliore per questo Unicode" di Python?
Domanda
Ho del testo che usa la punteggiatura Unicode, come virgolette doppie a sinistra, virgolette singole a destra per l'apostrofo e così via, e ne ho bisogno in ASCII. Python ha un database di questi personaggi con ovvi sostituti ASCII, quindi posso fare di meglio che trasformarli tutti in "quotazioni?" ?
Soluzione
Unidecode sembra una soluzione completa. Converte virgolette fantasiose in virgolette ASCII, caratteri latini accentati in non accentate e tenta persino la traslitterazione per gestire caratteri che non hanno equivalenti ASCII. In questo modo i tuoi utenti non devono vedere un sacco di? quando dovevi passare il loro testo attraverso un sistema ASCII legacy a 7 bit.
>>> from unidecode import unidecode
>>> print unidecode(u"\u5317\u4EB0")
Bei Jing
http://www.tablix.org/~avian / blog / archives / 2009/01 / unicode_transliteration_in_python /
Altri suggerimenti
Nella mia risposta originale, ho anche suggerito unicodedata.normalize
. Tuttavia, ho deciso di provarlo e si scopre che non funziona con le virgolette Unicode. Fa un buon lavoro nel tradurre caratteri Unicode accentati, quindi immagino che unicodedata.normalize
sia implementato usando la funzione unicode.decomposition
, il che mi porta a credere che probabilmente può solo gestire i caratteri Unicode che sono combinazioni di una lettera e un segno diacritico, ma non sono davvero un esperto delle specifiche Unicode, quindi potrei essere solo pieno di aria calda ...
In ogni caso, puoi utilizzare unicode.translate
per gestire i caratteri di punteggiatura. Il metodo translate
prende un dizionario di ordinali Unicode in ordinali Unicode, quindi puoi creare un mapping che traduca la punteggiatura solo Unicode in punteggiatura compatibile ASCII:
'Maps left and right single and double quotation marks'
'into ASCII single and double quotation marks'
>>> punctuation = { 0x2018:0x27, 0x2019:0x27, 0x201C:0x22, 0x201D:0x22 }
>>> teststring = u'\u201Chello, world!\u201D'
>>> teststring.translate(punctuation).encode('ascii', 'ignore')
'"hello, world!"'
Se necessario, puoi aggiungere più mappature di punteggiatura, ma non penso che devi necessariamente preoccuparti di gestire ogni singolo carattere di punteggiatura Unicode. Se fai devi gestire accenti e altri segni diacritici, puoi comunque usare unicodedata.normalize
per gestire quei personaggi.
Domanda interessante.
Google mi ha aiutato a trovare questa pagina che descrive usando modulo unicodedata come il seguente:
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
Ulteriori discussioni in merito sono disponibili all'indirizzo http://code.activestate.com/recipes/251871/ che ha la soluzione NFKD e alcuni modi per creare una tabella di conversione, per cose come ± = > +/- e altri caratteri non alfabetici.