2009-05-03 6 views
79

Ho un testo che usa la punteggiatura Unicode, come la virgoletta doppia sinistra, la virgoletta singola 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 girarli tutti in "?" ?Dov'è il database "best ASCII per questo Unicode" di Python?

+21

Sei coraggioso guerriero. Unicode è l'arcinemico di Python. –

+1

Le persone a cui potrebbe essere interessato [Qual è il modo migliore per rimuovere gli accenti in una stringa unicode Python?] (Http://stackoverflow.com/q/517923/562769) –

risposta

84

Unidecode sembra una soluzione completa. Converte citazioni di fantasia in virgolette ascii, caratteri latini accentati a non accentati e persino tentativi di traslitterazione per trattare personaggi 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/

+3

Hm .. le dieresi tedesche vengono convertite nel loro carattere di base anziché ad es. ö = oe, ä = ae, ecc. – ThiefMaster

+4

@ThiefMaster sono gli equivalenti veri in tutte le lingue? Forse Unidecode punta al minimo comune denominatore. –

+0

Unidecode è sicuramente la soluzione indipendente dalla lingua. Per una soluzione in tedesco, converti manualmente i caratteri applicabili ('s/ö/oe /', ecc.) Prima di pulire il resto con 'unidecode'. – alexis

19

Interessante domanda.

Google ha aiutato a trovare this page che descibes utilizzando il unicodedata module come il seguente:

import unicodedata 
unicodedata.normalize('NFKD', title).encode('ascii','ignore') 
+1

Utile, ma che elimina la punteggiatura Unicode . – joeforker

24

Nella mia risposta originale, ho anche suggerito unicodedata.normalize. Tuttavia, ho deciso di provarlo e risulta che non funziona con le virgolette Unicode. Fa un buon lavoro traducendo caratteri Unicode accentati, quindi suppongo che l'implementazione di unicodedata.normalize sia stata eseguita utilizzando la funzione unicode.decomposition, il che mi porta a credere che probabilmente possa gestire solo caratteri Unicode che sono combinazioni di una lettera e un segno diacritico, ma io sono non proprio un esperto sulla specifica Unicode, così ho potuto solo essere pieno di aria calda ...

In ogni caso, è possibile utilizzare unicode.translate a che fare con i caratteri di punteggiatura, invece. Il metodo translate prende un dizionario di ordinali Unicode per ordinali Unicode, in tal modo è possibile creare una mappatura che traduce solo Unicode punteggiatura ASCII-compatibile punteggiatura:

'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!"' 

È possibile aggiungere ulteriori mappature di punteggiatura, se necessario, ma io don Penso che sia necessario preoccuparsi di gestire ogni singolo carattere di punteggiatura Unicode. Se lo deve gestire accenti e altri segni diacritici, è comunque possibile utilizzare unicodedata.normalize per gestire tali caratteri.

+0

Vedere anche il pacchetto 'unidecode' – joeforker

3

C'è una discussione aggiuntiva su questo al http://code.activestate.com/recipes/251871/ che ha la soluzione NFKD e alcuni modi di fare una tabella di conversione, per cose come ± => +/- e altri caratteri non lettera.

Problemi correlati