Question

J'ai un texte qui utilise la ponctuation Unicode, comme une citation double gauche, une citation simple droite pour une apostrophe, etc., et j'en ai besoin en ASCII. Python a-t-il une base de données de ces caractères avec des substituts ASCII évidents pour que je puisse faire mieux que de les transformer tous en "?"? ?

Était-ce utile?

La solution

Unidecode ressemble à une solution complète. Il convertit les guillemets fantaisies en guillemets ascii, les caractères latins accentués en non accentués et tente même une translittération pour traiter les caractères qui n'ont pas d'équivalent ASCII. De cette façon, vos utilisateurs n'auront pas à en voir beaucoup? lorsque vous deviez passer leur texte dans un système ASCII hérité de 7 bits.

>>> from unidecode import unidecode
>>> print unidecode(u"\u5317\u4EB0")
Bei Jing 

http://www.tablix.org/~avian / blog / archives / 2009/01 / unicode_transliteration_in_python /

Autres conseils

Dans ma réponse initiale, j'ai également suggéré de unicodedata.normalize . Cependant, j'ai décidé de le tester et il s'avère que cela ne fonctionne pas avec les guillemets Unicode. Il traduit bien les caractères Unicode accentués. Je suppose donc que unicodedata.normalize est implémenté à l'aide de la fonction unicode.decomposition , ce qui me laisse penser qu'il peut probablement seulement gérer des caractères Unicode qui combinent une lettre et une marque diacritique, mais je ne suis pas vraiment un expert des spécifications Unicode, je pourrais donc être rempli d'air chaud ...

Dans tous les cas, vous pouvez utiliser unicode.translate pour traiter les caractères de ponctuation. La méthode translate utilise un dictionnaire d'ordinaux Unicode en ordinaux Unicode. Vous pouvez ainsi créer un mappage qui convertit la ponctuation Unicode uniquement en une ponctuation compatible 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!"'

Vous pouvez ajouter davantage de mappages de ponctuation si nécessaire, mais je ne pense pas que vous ayez nécessairement à vous soucier de la gestion de chaque caractère de ponctuation Unicode. Si vous avez besoin de gérer les accents et autres marques diacritiques, vous pouvez toujours utiliser unicodedata.normalize pour traiter ces caractères.

Question intéressante.

Google m'a aidé à trouver cette page , qui décrit le module unicodedata comme suit:

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

Vous trouverez d'autres discussions à ce sujet à l'adresse http://code.activestate.com/recipes/251871/. qui contient la solution NFKD et quelques façons de créer une table de conversion, par exemple, & # 177; = > +/- et autres caractères non-lettres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top