Tout ce que vous ne vouliez jamais savoir sur la normalisation Unicode
Normalisation canonique
Unicode comprend plusieurs façons d'encoder certains caractères, notamment les caractères accentués. La normalisation canonique transforme les points de code en une forme d'encodage canonique. Les points de code résultants doivent apparaître identiques à ceux d'origine, à l'exception de tout bogue dans les polices ou le moteur de rendu.
Quand utiliser
Étant donné que les résultats semblent identiques, il est toujours prudent d'appliquer la normalisation canonique à une chaîne avant de la stocker ou de l'afficher, tant que vous pouvez tolérer que le résultat ne soit pas bit par bit identique à l'entrée.
La normalisation canonique se présente sous 2 formes: NFD et NFC. Les deux sont équivalents dans le sens où l'on peut convertir entre ces deux formes sans perte. Comparer deux chaînes sous NFC donnera toujours le même résultat que les comparer sous NFD.
NFD
NFD a les personnages entièrement développés. C'est la forme de normalisation la plus rapide à calculer, mais les résultats en plus de points de code (c'est-à-dire utilise plus d'espace).
Si vous souhaitez simplement comparer deux chaînes qui ne sont pas déjà normalisées, c'est la forme de normalisation préférée, sauf si vous savez que vous avez besoin d'une normalisation de compatibilité.
NFC
NFC recombine les points de code lorsque cela est possible après l'exécution de l'algorithme NFD. Cela prend un peu plus de temps, mais entraîne des chaînes plus courtes.
Normalisation de la compatibilité
Unicode comprend également de nombreux caractères qui n'appartiennent vraiment pas, mais qui ont été utilisés dans les anciens jeux de caractères. Unicode les a ajoutés pour permettre au texte de ces jeux de caractères d'être traité comme Unicode, puis d'être reconverti sans perte.
La normalisation de compatibilité les convertit en la séquence correspondante de caractères "réels" et effectue également une normalisation canonique. Les résultats de la normalisation de la compatibilité peuvent ne pas sembler identiques aux originaux.
Les caractères contenant des informations de mise en forme sont remplacés par ceux qui n'en contiennent pas. Par exemple, le caractère ⁹
est converti en 9
. D'autres n'impliquent pas de différences de formatage. Par exemple, le caractère numérique romain Ⅸ
est converti en lettres normales IX
.
Évidemment, une fois cette transformation effectuée, il n'est plus possible de reconvertir sans perte le jeu de caractères d'origine.
Quand utiliser
Le Consortium Unicode suggère de penser à la normalisation de la compatibilité comme une ToUpperCase
transformation. C'est quelque chose qui peut être utile dans certaines circonstances, mais vous ne devez pas simplement l'appliquer bon gré mal gré.
Un excellent cas d'utilisation serait un moteur de recherche, car vous voudriez probablement que la recherche 9
corresponde ⁹
.
Une chose que vous ne devriez probablement pas faire est d'afficher le résultat de l'application de la normalisation de compatibilité à l'utilisateur.
NFKC / NFKD
Le formulaire de normalisation de compatibilité se présente sous deux formes: NFKD et NFKC. Ils ont la même relation qu'entre NFD et C.
Toute chaîne dans NFKC est intrinsèquement également dans NFC, et il en va de même pour NFKD et NFD. Ainsi NFKD(x)=NFD(NFKC(x))
, et NFKC(x)=NFC(NFKD(x))
, etc.
Conclusion
En cas de doute, optez pour la normalisation canonique. Choisissez NFC ou NFD en fonction du compromis espace / vitesse applicable, ou en fonction de ce qui est requis par quelque chose avec lequel vous interagissez.