2010-06-27 5 views
3

Je cherche à standardiser du texte unicode en python. Je me demande s'il existe un moyen facile d'obtenir la forme "dénormalisée" d'un caractère unicode combinant en python? par exemple. si j'ai la séquence u'o \ xaf '(c'est-à-dire latin small letter o suivi de combining macron), pour obtenir ō (latin small letter o with macron). Il est facile d'aller dans l'autre sens:Python "dénormaliser" unicode combinant les caractères

o = unicodedata.lookup("LATIN SMALL LETTER O WITH MACRON") 
o = unicodedata.normalize('NFD', o) 
+0

U + 00AF n'est pas un * combinant * Macron. C'est U + 0304. – kennytm

+0

'\ xaf' n'est pas le macron de combinaison,' \ u0304' est. –

+0

oups. Vous avez mélangé les chiffres quand j'ai écrit la question :) – Puzzled79

Répondre

4

Comme je l'ai commenté, U + 00AF n'est pas une combinaison Macron. Mais vous pouvez le convertir en U + 0020 U + 0304 avec une transformation NFKD.

>>> unicodedata.normalize('NFKD', u'o\u00af') 
u'o \u0304' 

Ensuite, vous pouvez supprimer l'espace et obtenir ō avec NFC.


(Notez que NFKD est assez agressif sur la décomposition d'une manière que certains sémantiques peuvent être perdues -. Tout ce qui est sera séparée "compatible" out par exemple

  • '½' (U + 008D) ↦ '1''⁄' (U + 2044) '2';
  • '²' (U + 00B2) ↦ '2'
  • '①' (U + 2460) ↦ '1'

etc.)

+0

Fonctionne comme un charme! Merci - j'avais essayé NFKD, mais je n'ai pas pensé à le re-normaliser à nouveau. – Puzzled79

+0

Étant donné que la chaîne que la question devait spécifier comme entrée était 'u'o \ u0304'', la normalisation NFKD n'est pas nécessaire en premier. Effectuer juste la normalisation NFC sur cette chaîne est suffisant pour obtenir le résultat souhaité de 'u '\ u014d''. – markshep

+0

@markshep: Veuillez lire attentivement la question de l'OP, la séquence d'entrée était 'u'o \ xaf'', c'est-à-dire" o¯ ", ** pas **' u'o \ u0304''. Vous devez faire NFKD pour convertir le '' \ xaf'' en ''\ u0304''. – kennytm

3
o = unicodedata.normalize('NFC', o) 
Questions connexes