Unicode, de la normalisation de la norme

La norme Unicode a été développée afin de pouvoir représenter n’importe quel caractère de n’importe quelle forme d’écriture.

Alors que l’ASCII ne peut représenter que 128 caractères, Unicode est constitué de plus de 109000 caractères, et pourrait en contenir potentiellement des millions.

Puisqu’il s’agit d’une norme, comparer deux textes Unicode ne devrait pas poser de problèmes. Sauf que…  il peut y avoir plusieurs représentations d’un même caractère en Unicode : la Forme Normale Canonique (NFC) ou la Forme Normale Décomposée (NFD).

Sous la forme NFC, le caractère « é » possède son propre code , alors que sous la forme NFD il est décomposé dans sa forme de base « e » combinée avec son signe diacritique (l’accent)  » ‘ « .

Donc, pour deux mots codés Unicode semblants similaires, il faudra faire attention à la normalisation ( exemple Python ) :

>>> import unicodedata
>>> c = unicodedata.normalize("NFC", u"é" )
>>> print repr(c)
u'\xe9'
>>> d = unicodedata.normalize("NFD", u"é" )
>>> print d
>>> print repr(d)
u'e\u0301'
>>> c == d
False

Sources :  Nicolas SURRIBAS, doc Python  et Wikipedia

Cette entrée a été publiée dans blog, dev et taggé , . Ajoutez le permalien à vos favoris.