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 "?" ?
Réponses
Trop de publicités?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/
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.
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')
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.