Maison >développement back-end >C++ >Comment puis-je comparer des chaînes en C# tout en ignorant les caractères accentués ?

Comment puis-je comparer des chaînes en C# tout en ignorant les caractères accentués ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-24 16:07:10495parcourir

How Can I Compare Strings in C# While Ignoring Accented Characters?

Ignorer les caractères accentués lors de la comparaison de chaînes en C#

La gestion des comparaisons de chaînes avec des caractères accentués peut être délicate en C#. Prenons l'exemple suivant :

<code class="language-csharp">string s1 = "hello";
string s2 = "héllo";

s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase);
s1.Equals(s2, StringComparison.OrdinalIgnoreCase);</code>

Les deux chaînes doivent être égales, mais les deux déclarations renvoient faux. En effet, les accents des lettres sont traités comme des caractères différents. Pour résoudre ce problème, nous pouvons utiliser une technique qui supprime les symboles supplémentaires (ou accents) avant de comparer les chaînes.

Supprimer les symboles supplémentaires

Voici un moyen de supprimer des symboles supplémentaires d'une chaîne :

<code class="language-csharp">static string RemoveDiacritics(string text)
{
    // 将字符串规范化为 Unicode 规范化形式 D
    string formD = text.Normalize(NormalizationForm.FormD);

    // 创建一个 StringBuilder 来保存结果字符串
    StringBuilder sb = new StringBuilder();

    // 迭代规范化字符串中的字符
    foreach (char ch in formD)
    {
        // 检查字符是否不是非间隔标记
        UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(ch);
        if (uc != UnicodeCategory.NonSpacingMark)
        {
            // 将字符附加到 StringBuilder
            sb.Append(ch);
        }
    }

    // 将 StringBuilder 转换为字符串并将其规范化为 Unicode 规范化形式 C
    return sb.ToString().Normalize(NormalizationForm.FormC);
}</code>

Cette méthode normalise d'abord la chaîne sous la forme D, qui divise les caractères accentués en plusieurs caractères. Il parcourt ensuite ces caractères et filtre les jetons sans espacement (c'est-à-dire les accents). Enfin, il recombine les caractères restants pour former une chaîne non accentuée.

Pour utiliser cette méthode, appliquez-la simplement à deux chaînes avant de les comparer. Par exemple :

<code class="language-csharp">string s1 = "hello";
string s2 = "héllo";

s1.Equals(RemoveDiacritics(s2), StringComparison.InvariantCultureIgnoreCase);  // True</code>

Cela sera correctement évalué à vrai, en considérant le « e » accentué dans « bonjour » comme équivalent au « e » non accentué dans « bonjour ».

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn