Looking for .net Keywords? Try Ask4Keywords

.NET FrameworkCordes


Remarques

Dans les chaînes .NET, System.String est une séquence de caractères System.Char , chaque caractère est une unité de code codée UTF-16. Cette distinction est importante car la définition du caractère dans la langue parlée et la définition du caractère .NET (et de nombreuses autres langues) sont différentes.

Un caractère , qui devrait être correctement appelé grapheme , est affiché comme un glyphe et est défini par un ou plusieurs points de code Unicode. Chaque point de code est ensuite codé dans une séquence d' unités de code . Maintenant, il devrait être clair pourquoi un seul System.Char ne représente pas toujours un graphème, voyons dans la réalité comment ils sont différents:

  • Un graphème, en raison de la combinaison de caractères , peut donner deux ou plusieurs points de code: à est composé de deux points de code: U + 0061 LETTRE MINUSCULE LATINE A et U + 0300 COMBINING ACCENT ACCENT . C'est l'erreur la plus courante car "à".Length == 2 alors que vous pouvez vous attendre à 1 .
  • Il y a des caractères dupliqués, par exemple à peut être un seul point de code U + 00E0 LATIN SMALL LETTER A AVEC GRAVE ou deux points de code comme expliqué ci-dessus. Évidemment, ils doivent comparer le même: "\u00e0" == "\u0061\u0300" (même si "\u00e0".Length != "\u0061\u0300".Length ). Cela est possible en raison de la normalisation de chaîne effectuée par la méthode String.Normalize() .
  • Une séquence Unicode peut contenir une séquence composée ou décomposé, par exemple le caractère U + D55C HAN caractère peut être un seul point de code (codé comme un seul code-unité UTF-16) ou une séquence décomposée de ses syllabes ᄒ, et . Ils doivent être comparés à égalité.
  • Un point de code peut être codé en plusieurs unités de code: caractère 𠂊 U + 2008A HAN CHARACTER est codé sous la forme de deux System.Char ( "\ud840\udc8a" ) même s'il ne s'agit que d'un seul point de code: UTF-16 l'encodage n'est pas de taille fixe! Ceci est une source d'innombrables bogues (également des bogues de sécurité sérieux), si par exemple votre application applique une longueur maximale et tronque aveuglément la chaîne à ce moment-là, vous pouvez créer une chaîne non valide.
  • Certaines langues ont un digraphe et des trigraphes, par exemple en tchèque ch est une lettre autonome (après h et avant i, lorsque vous commandez une liste de chaînes, vous aurez fyzika avant chimie .

Il y a beaucoup plus de problèmes concernant la gestion du texte, voir par exemple Comment puis-je effectuer une comparaison caractère par caractère compatible avec Unicode? pour une introduction plus large et plus de liens vers des arguments connexes.

En général, lorsque vous traitez du texte international, vous pouvez utiliser cette fonction simple pour énumérer des éléments de texte dans une chaîne (en évitant de casser les substituts et l’encodage Unicode):

public static class StringExtensions
{
    public static IEnumerable<string> EnumerateCharacters(this string s)
    {
        if (s == null)
            return Enumerable.Empty<string>();

        var enumerator = StringInfo.GetTextElementEnumerator(s.Normalize());
        while (enumerator.MoveNext())
            yield return (string)enumerator.Value;
    }
}

Cordes Exemples Liés