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?" ?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top