web-dev-qa-db-fra.com

Où est la meilleure base de données de Python ASCII pour cette base de données Unicode)?

J'ai du texte qui utilise la ponctuation Unicode, comme le guillemet double gauche, le guillemet simple droit pour l'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 évidents ASCII pour que je puisse faire mieux que de les transformer tous en "?"?

83
joeforker

nidecode ressemble à une solution complète. Il convertit les guillemets de fantaisie en guillemets ascii, les caractères latins accentués en non accentués et tente même la translittération pour traiter les caractères qui n'ont pas ASCII équivalents. De cette façon, vos utilisateurs n'ont pas besoin de voir un tas de? lorsque vous avez dû passer leur texte via un système ascii 7 bits hérité.

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

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

87
joeforker

Dans ma réponse originale, j'ai également suggéré 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 fait un bon travail de traduction des caractères Unicode accentués, donc je suppose que unicodedata.normalize est implémenté à l'aide de unicode.decomposition, ce qui m'amène à penser qu'elle ne peut probablement gérer que des caractères Unicode qui sont des combinaisons d'une lettre et d'un signe diacritique, mais je ne suis pas vraiment un expert de la spécification Unicode, donc je pourrais juste être plein d'air chaud. ..

Dans tous les cas, vous pouvez utiliser unicode.translate pour traiter les caractères de ponctuation à la place. La méthode translate prend un dictionnaire d'ordinaux Unicode en ordinaux Unicode, vous pouvez donc créer un mappage qui traduit la ponctuation Unicode uniquement en 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 plus 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 faites devez gérer les accents et autres signes diacritiques, vous pouvez toujours utiliser unicodedata.normalize pour gérer ces personnages.

24
Mike Spross

Question interessante.

Google m'a aidé à trouver cette page qui décrit à l'aide du module unicodedata comme suit:

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

Il y a une discussion supplémentaire à ce sujet sur http://code.activestate.com/recipes/251871/ qui a la solution NFKD et quelques façons de faire une table de conversion, pour des choses comme ± => +/- et d'autres caractères autres que des lettres.

3
Andrew Dalke