Unicode, c'est simple sauf quand c'est compliqué

par Vincent Poulailleau - 3 minutes de lecture - 462 mots

Unicode, le problème

Unicode, c’est simple sauf quand c’est compliqué !

Oui, le texte « Python est génial » n’est pas le même que « Python est génial ». Pourtant il s’affiche pareil !

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from unicodedata import name, normalize

texte1 = "Python est génial"
texte2 = "Python est génial"

print(texte1 == texte2) # False, WTF!

print(texte1.encode("utf-8")) # b'Python est g\xc3\xa9nial'
print(texte2.encode("utf-8")) # b'Python est ge\xcc\x81nial'

print(normalize("NFC", texte1) == normalize("NFC", texte2)) # True

La normalization

Qu’est-ce que c’est que ces histoires de normalisation ? Un « é » peut être un « e accent aigu », mais il peut être aussi un « e » suivi d’un « accent aigu qui se combine avec le caractère précédent ». Ce sera dans ce cas deux caractères et non un seul.

Il est possible de le voir avec deux petits programmes Python :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
for char in texte1:
    print(name(char))
# LATIN CAPITAL LETTER P
# LATIN SMALL LETTER Y
# LATIN SMALL LETTER T
# LATIN SMALL LETTER H
# LATIN SMALL LETTER O
# LATIN SMALL LETTER N
# SPACE
# LATIN SMALL LETTER E
# LATIN SMALL LETTER S
# LATIN SMALL LETTER T
# SPACE
# LATIN SMALL LETTER G
# LATIN SMALL LETTER E WITH ACUTE
# LATIN SMALL LETTER N
# LATIN SMALL LETTER I
# LATIN SMALL LETTER A
# LATIN SMALL LETTER L

Et

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
for char in texte2:
    print(name(char))
# LATIN CAPITAL LETTER P
# LATIN SMALL LETTER Y
# LATIN SMALL LETTER T
# LATIN SMALL LETTER H
# LATIN SMALL LETTER O
# LATIN SMALL LETTER N
# SPACE
# LATIN SMALL LETTER E
# LATIN SMALL LETTER S
# LATIN SMALL LETTER T
# SPACE
# LATIN SMALL LETTER G
# LATIN SMALL LETTER E
# COMBINING ACUTE ACCENT
# LATIN SMALL LETTER N
# LATIN SMALL LETTER I
# LATIN SMALL LETTER A
# LATIN SMALL LETTER L

Il existe plusieurs façons de normaliser un texte, c’est à dire choisir systématiquement la même combinaison de caractères pour un caractère affiché :

Malheureusement pour nous, il existe de nombreuses subtilités en Unicode. À moins que ce ne soit fait pour le plaisir des testeurs !

Et vous, Unicode vous a surpris ?