88 votes

Où se trouve la meilleure base de données ASCII pour Python pour cet Unicode?

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

91voto

joeforker Points 14483

Unidecode ressemble à une solution complète. Il convertit fantaisie citations ascii citations, accentués en caractères latins à atones, et même des tentatives de translittération de traiter avec des personnages qui n'ont pas d'équivalents ASCII. De cette façon, vos utilisateurs n'ont pas à voir un tas de ? quand vous avez eu à passer leur texte par le biais d'un héritage ascii 7 bits système.

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

http://www.tablix.org/~aviaire/blog/archives/2009/01/unicode%5Ftransliteration%5Fin%5Fpython/

27voto

Mike Spross Points 4825

Originale dans ma réponse, j'ai également proposé unicodedata.normalize. Cependant, j'ai décidé de le tester et il s'avère qu'il ne fonctionne pas avec Unicode guillemets. Il fait un bon travail de traduction accentués en caractères Unicode, donc je suppose unicodedata.normalize est mis en œuvre à l'aide de l' unicode.decomposition de la fonction, ce qui m'amène à croire qu'il probablement ne peut gérer que des caractères Unicode qui sont une combinaison d'une lettre et d'un signe diacritique, mais je ne suis pas vraiment un expert sur la spécification Unicode, donc je pourrais juste être plein d'air chaud...

Dans tous les cas, vous pouvez utiliser unicode.translate pour composer avec les caractères de ponctuation à la place. L' translate méthode prend un dictionnaire de l'Unicode des ordinaux en Unicode ordinaux, ainsi vous pouvez créer un mappage qui se traduit par Unicode uniquement ponctuation compatible ASCII de la ponctuation:

'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 ponctuation mappages si nécessaire, mais je ne pense pas que vous avez nécessairement besoin de s'inquiéter à propos de la manipulation de chaque Unicode caractère de ponctuation. Si vous ne devez gérer les accents et autres signes diacritiques, vous pouvez toujours utiliser unicodedata.normalize pour faire face à ces personnages.

23voto

easel Points 2466

Question interessante.

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

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

3voto

Andrew Dalke Points 7607

Vous trouverez d'autres discussions à ce sujet sur http://code.activestate.com/recipes/251871/, qui contient la solution NFKD et certaines manières de créer une table de conversion, par exemple ± => +/- et d'autres caractères non alphabétiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X