Normalisation et tri

Mise à jour : novembre 2007

Certains caractères Unicode ont plusieurs représentations binaires équivalentes : des combinaisons de caractères Unicode ou des caractères Unicode composites. Par conséquent, deux chaînes peuvent sembler identiques mais être en réalité composées de caractères différents. L'existence de plusieurs représentations pour un seul caractère complique les opérations de tri. La solution à ce problème consiste à normaliser chaque chaîne, puis à utiliser une comparaison ordinale pour trier les chaînes.

La norme Unicode définit un processus appelé normalisation qui retourne une seule représentation binaire d'un caractère lorsque plusieurs représentations binaires équivalentes existent. La norme Unicode définit quatre algorithmes différents, appelés formulaires de normalisation, que vous pouvez utiliser pour normaliser une chaîne. Chaque formulaire de normalisation obéit à différentes règles, et produit par conséquent une représentation binaire différente d'une chaîne d'entrée. Toutefois, si deux chaînes sont normalisées à l'aide du même formulaire de normalisation, les chaînes peuvent ensuite être comparées à l'aide d'une comparaison (respect de la casse) ordinale.

Une comparaison ordinale de deux chaînes consiste en une comparaison binaire de la valeur numérique, ou point de code, de chaque paire correspondante des structures Char dans les deux objets String qui représentent les chaînes normalisées. Le .NET Framework fournit plusieurs méthodes capables d'effectuer une comparaison ordinale.

Votre application peut utiliser le processus suivant pour normaliser et trier des chaînes :

  1. Récupérez deux chaînes à trier dans une source d'entrée telle qu'un fichier ou une entrée d'utilisateur.

  2. Utilisez la méthode String.Normalize() pour normaliser les deux chaînes au formulaire de normalisation C, ou la méthode String.Normalize(NormalizationForm) pour normaliser les deux chaînes à un formulaire de normalisation de votre choix.

  3. Utilisez une comparaison de chaînes ordinale, telle que la méthode Compare(String, Int32, String, Int32, Int32, StringComparison) avec une valeur Ordinal ou OrdinalIgnoreCase, pour comparer les deux chaînes. L'opération de comparaison détermine si la première chaîne précède la seconde de façon lexicale ou les deux chaînes sont lexicalement égales.

  4. Émettez les chaînes dans la sortie triée sur la base des résultats de l'étape 3. Si les chaînes ne sont pas égales, émettez les chaînes dans l'ordre qui correspond à l'ordre croissant ou décroissant.

    Si les chaînes sont égales, chacune des chaînes peut être émise en premier à moins qu'il soit préférable d'organiser les chaînes en fonction d'un facteur autre que l'ordre lexical. Par exemple, si l'application trie des noms de fichiers, mais également les propriétés de chaque fichier dans la sortie, elle peut écrire des noms de fichiers égaux dans l'ordre de leur date de création.

  5. Répétez ce processus jusqu'à ce que toute l'entrée soit triée.

Pour plus d'informations sur la prise en charge des formulaires de normalisation dans .NET Framework, consultez la description de l'énumération NormalizationForm. Pour plus d'informations sur la normalisation d'une chaîne, consultez la méthode Normalize.

Pour plus d'informations sur la normalisation, l'équivalence et la décomposition des caractères, consultez l'annexe 15 de la norme Unicode traitant des formulaires de normalisation Unicode, sur le site Web Unicode.

Voir aussi

Concepts

Normalisation

Tri avec les cultures

Comparaison et tri des données pour une culture spécifique

Autres ressources

Codage et localisation