Dov'è il "miglior database ASCII per questo Unicode" di Python? [chiuso]


86

Ho del testo che utilizza la punteggiatura Unicode, come virgolette doppie a sinistra, virgolette singole a destra per apostrofo e così via, e ne ho bisogno in ASCII. Python ha un database di questi caratteri con ovvi sostituti ASCII, quindi posso fare di meglio che trasformarli tutti in "?" ?


2

Risposte:


90

Unidecode sembra una soluzione completa. Converte citazioni fantasiose in virgolette ASCII, caratteri latini accentati in non accentati e tenta persino la traslitterazione per gestire caratteri che non hanno equivalenti ASCII. In questo modo i tuoi utenti non devono vedere molti? quando dovevi passare il loro testo attraverso un sistema ASCII a 7 bit legacy.

>>> 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 invece di ad es.
Ö

4
@ThiefMaster sono questi equivalenti veri in tutte le lingue? Forse Unidecode sta andando per il minimo comune denominatore.
Mark Ransom

Unidecode va sicuramente per la soluzione indipendente dalla lingua. Per una soluzione incentrata sulla Germania, converti manualmente i caratteri applicabili ( s/ö/oe/e così via) prima di ripulire il resto con unidecode.
alexis

4
Infatti, in finlandese per esempio, mentre ä -> a, ö -> oè a titolo definitivo sbagliato, è ancora preferibile aeeoe
Antti Haapala

25

Nella mia risposta originale, ho anche suggerito unicodedata.normalize. Tuttavia, ho deciso di provarlo e si è scoperto che non funziona con le virgolette Unicode. Fa un buon lavoro traducendo caratteri Unicode accentati, quindi immagino unicodedata.normalizesia implementato utilizzando la unicode.decompositionfunzione, il che mi porta a credere che probabilmente possa gestire solo caratteri Unicode che sono combinazioni di una lettera e un segno diacritico, ma non lo sono davvero un esperto della specifica Unicode, quindi potrei essere pieno di aria calda ...

In ogni caso, puoi usare invece unicode.translateper trattare i caratteri di punteggiatura. Il translatemetodo utilizza un dizionario di ordinali Unicode in ordinali Unicode, quindi puoi creare una mappatura 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!"'

Puoi aggiungere più mappature di punteggiatura se necessario, ma non penso che tu debba necessariamente preoccuparti di gestire ogni singolo carattere di punteggiatura Unicode. Se non c'è bisogno di accenti maniglia e altri segni diacritici, è comunque possibile utilizzare unicodedata.normalizeper far fronte a tali caratteri.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.