OVH Cloud OVH Cloud

Comparer des chaines sans tenir compte des accents

9 réponses
Avatar
Faure-vincent Pascal
Bonjour

Je n'arrives absolument pas à trouver une solution pour comparer 2 chaines
sans tenir compte des accents.
Le framework doit surement résoudre cela facilement sans que l'on fasse une
méthode propriétaire.
On m'a parlé d'utiliser la classe StreamBuilder pour encoder les 2 chaines
avec le même encodage mais je n'y arrives pas.
Si quelqu'un peut m'aiguiller çà serait sympa.
Merci d'avance
pascal

9 réponses

Avatar
Guy Montagnon
Salut,
Utilise la methode String.Replace qui remplace toutes les occurances de
caractères par un autre et après compare tes chaînes :
string s = "éà à ééé ààà";
s = s.Replace('é','e');
s = s.Replace('à','a');
MessageBox.Show(s);

C'est une solution lourde mais qui marche.
Guy

"Faure-vincent Pascal" a écrit dans le
message de news:
Bonjour

Je n'arrives absolument pas à trouver une solution pour comparer 2 chaines
sans tenir compte des accents.
Le framework doit surement résoudre cela facilement sans que l'on fasse
une méthode propriétaire.
On m'a parlé d'utiliser la classe StreamBuilder pour encoder les 2 chaines
avec le même encodage mais je n'y arrives pas.
Si quelqu'un peut m'aiguiller çà serait sympa.
Merci d'avance
pascal






Avatar
Lloyd Dupont
Quid de lire la documentation?
bon chez moi j;ai que le framework en anglais alors chais pas si c'est
pareil en Francais mais:

si je tape (aie) string.compare dans l'index j'obtiens:
Performing Culture insensitive string comparison !!!!

using System.Globalization;

public class CompareSample
{
public static void Main()
{
String string1 = "file";
String string2 = "FILE";

int compareResult = String.Compare(string1, string2, false,
CultureInfo.InvariantCulture);
Console.WriteLine("A case-insensitive comparison of {0} and {1} is
{2}", string1, string2, compareResult);
}
}


"Faure-vincent Pascal" wrote in message
news:
Bonjour

Je n'arrives absolument pas à trouver une solution pour comparer 2 chaines
sans tenir compte des accents.
Le framework doit surement résoudre cela facilement sans que l'on fasse
une méthode propriétaire.
On m'a parlé d'utiliser la classe StreamBuilder pour encoder les 2 chaines
avec le même encodage mais je n'y arrives pas.
Si quelqu'un peut m'aiguiller çà serait sympa.
Merci d'avance
pascal






Avatar
Fred
Bonsoir,
Si c'est pareil que pour le VB, cela ne répond pas au problème.
D'après ce que j'ai compris (et une solution "élégante" m'intéresse
également), Pascal souhaite que "e" soit non seulement égal à "E" mais aussi
à "é" et "è".
Or l'option Compare Text du VB, sans doute équivalente à l'utilisation du
CultureInfo.InvariantCulture, donne bien "e"="E" mais "e"<"é", et même si
tous les caractères "e" accentués sont bien inférieurs à "f", cela me paraît
difficilement exploitable pour conclure que "eeee" = "eéèê" par exemple.


"Lloyd Dupont" a écrit dans le message de news:

Quid de lire la documentation?
bon chez moi j;ai que le framework en anglais alors chais pas si c'est
pareil en Francais mais:

si je tape (aie) string.compare dans l'index j'obtiens:
Performing Culture insensitive string comparison !!!!

using System.Globalization;

public class CompareSample
{
public static void Main()
{
String string1 = "file";
String string2 = "FILE";

int compareResult = String.Compare(string1, string2, false,
CultureInfo.InvariantCulture);
Console.WriteLine("A case-insensitive comparison of {0} and {1} is
{2}", string1, string2, compareResult);
}
}


"Faure-vincent Pascal" wrote in


message
news:
> Bonjour
>
> Je n'arrives absolument pas à trouver une solution pour comparer 2


chaines
> sans tenir compte des accents.
> Le framework doit surement résoudre cela facilement sans que l'on fasse
> une méthode propriétaire.
> On m'a parlé d'utiliser la classe StreamBuilder pour encoder les 2


chaines
> avec le même encodage mais je n'y arrives pas.
> Si quelqu'un peut m'aiguiller çà serait sympa.
> Merci d'avance
> pascal
>
>
>
>




Avatar
Lloyd Dupont
en VB ca donne (direct de la doc):
Imports System
Imports System.Globalization

Public Class CompareSample
Public Shared Sub Main()
Dim string1 As String = "file"
Dim string2 As String = "FILE"

Dim compareResult As Integer = String.Compare(string1, string2, _
False, CultureInfo.InvariantCulture)
Console.WriteLine("A case-insensitive comparison of {0} and {1} is _
{2}", string1, string2, compareResult)
End Sub
End Class



"Fred" wrote in message
news:%237Ibih$
Bonsoir,
Si c'est pareil que pour le VB, cela ne répond pas au problème.
D'après ce que j'ai compris (et une solution "élégante" m'intéresse
également), Pascal souhaite que "e" soit non seulement égal à "E" mais
aussi
à "é" et "è".
Or l'option Compare Text du VB, sans doute équivalente à l'utilisation du
CultureInfo.InvariantCulture, donne bien "e"="E" mais "e"<"é", et même si
tous les caractères "e" accentués sont bien inférieurs à "f", cela me
paraît
difficilement exploitable pour conclure que "eeee" = "eéèê" par exemple.


"Lloyd Dupont" a écrit dans le message de
news:

Quid de lire la documentation?
bon chez moi j;ai que le framework en anglais alors chais pas si c'est
pareil en Francais mais:

si je tape (aie) string.compare dans l'index j'obtiens:
Performing Culture insensitive string comparison !!!!

using System.Globalization;

public class CompareSample
{
public static void Main()
{
String string1 = "file";
String string2 = "FILE";

int compareResult = String.Compare(string1, string2, false,
CultureInfo.InvariantCulture);
Console.WriteLine("A case-insensitive comparison of {0} and {1}
is
{2}", string1, string2, compareResult);
}
}


"Faure-vincent Pascal" wrote in


message
news:
> Bonjour
>
> Je n'arrives absolument pas à trouver une solution pour comparer 2


chaines
> sans tenir compte des accents.
> Le framework doit surement résoudre cela facilement sans que l'on fasse
> une méthode propriétaire.
> On m'a parlé d'utiliser la classe StreamBuilder pour encoder les 2


chaines
> avec le même encodage mais je n'y arrives pas.
> Si quelqu'un peut m'aiguiller çà serait sympa.
> Merci d'avance
> pascal
>
>
>
>








Avatar
Fred
Bonjour,
J'ai bien compris. J'ai, moi aussi, lu la doc, et en plus j'ai testé
l'exemple de code.
Première chose : cet exemple renvoie l'égalité des deux chaînes si le
paramètre IgnoreCase est à True et non False.
Deuxième chose : comme je le signalais les caracères e accentués ne sont pas
considérés comme égaux à e, mais supérieurs à e.

"Lloyd Dupont" a écrit dans le message de
news:
en VB ca donne (direct de la doc):
Imports System
Imports System.Globalization

Public Class CompareSample
Public Shared Sub Main()
Dim string1 As String = "file"
Dim string2 As String = "FILE"

Dim compareResult As Integer = String.Compare(string1, string2, _
False, CultureInfo.InvariantCulture)
Console.WriteLine("A case-insensitive comparison of {0} and {1} is


_
{2}", string1, string2, compareResult)
End Sub
End Class



"Fred" wrote in message
news:%237Ibih$
> Bonsoir,
> Si c'est pareil que pour le VB, cela ne répond pas au problème.
> D'après ce que j'ai compris (et une solution "élégante" m'intéresse
> également), Pascal souhaite que "e" soit non seulement égal à "E" mais
> aussi
> à "é" et "è".
> Or l'option Compare Text du VB, sans doute équivalente à l'utilisation


du
> CultureInfo.InvariantCulture, donne bien "e"="E" mais "e"<"é", et même


si
> tous les caractères "e" accentués sont bien inférieurs à "f", cela me
> paraît
> difficilement exploitable pour conclure que "eeee" = "eéèê" par exemple.
>
>
> "Lloyd Dupont" a écrit dans le message de
> news:
>
>> Quid de lire la documentation?
>> bon chez moi j;ai que le framework en anglais alors chais pas si c'est
>> pareil en Francais mais:
>>
>> si je tape (aie) string.compare dans l'index j'obtiens:
>> Performing Culture insensitive string comparison !!!!
>>
>> using System.Globalization;
>>
>> public class CompareSample
>> {
>> public static void Main()
>> {
>> String string1 = "file";
>> String string2 = "FILE";
>>
>> int compareResult = String.Compare(string1, string2, false,
>> CultureInfo.InvariantCulture);
>> Console.WriteLine("A case-insensitive comparison of {0} and {1}
>> is
>> {2}", string1, string2, compareResult);
>> }
>> }
>>
>>
>> "Faure-vincent Pascal" wrote in
> message
>> news:
>> > Bonjour
>> >
>> > Je n'arrives absolument pas à trouver une solution pour comparer 2
> chaines
>> > sans tenir compte des accents.
>> > Le framework doit surement résoudre cela facilement sans que l'on


fasse
>> > une méthode propriétaire.
>> > On m'a parlé d'utiliser la classe StreamBuilder pour encoder les 2
> chaines
>> > avec le même encodage mais je n'y arrives pas.
>> > Si quelqu'un peut m'aiguiller çà serait sympa.
>> > Merci d'avance
>> > pascal
>> >
>> >
>> >
>> >
>>
>>
>
>




Avatar
Faure-vincent Pascal
C'est gentil à tous . si j'ai une solution qui me convienne je vous fait
signe
pascal



"Faure-vincent Pascal" a écrit dans le
message de news:
Bonjour

Je n'arrives absolument pas à trouver une solution pour comparer 2 chaines
sans tenir compte des accents.
Le framework doit surement résoudre cela facilement sans que l'on fasse
une méthode propriétaire.
On m'a parlé d'utiliser la classe StreamBuilder pour encoder les 2 chaines
avec le même encodage mais je n'y arrives pas.
Si quelqu'un peut m'aiguiller çà serait sympa.
Merci d'avance
pascal






Avatar
Lloyd Dupont
Desole je t'avais mal compris.
Bon j'ai bien chercher et malheuresement 'é' et 'e' sont different, on
peu(?) rien y faire!

Suggestion => implemente ta propre fonction de comparaison ...

"Fred" wrote in message
news:
Bonjour,
J'ai bien compris. J'ai, moi aussi, lu la doc, et en plus j'ai testé
l'exemple de code.
Première chose : cet exemple renvoie l'égalité des deux chaînes si le
paramètre IgnoreCase est à True et non False.
Deuxième chose : comme je le signalais les caracères e accentués ne sont
pas
considérés comme égaux à e, mais supérieurs à e.

"Lloyd Dupont" a écrit dans le message de
news:
en VB ca donne (direct de la doc):
Imports System
Imports System.Globalization

Public Class CompareSample
Public Shared Sub Main()
Dim string1 As String = "file"
Dim string2 As String = "FILE"

Dim compareResult As Integer = String.Compare(string1, string2, _
False, CultureInfo.InvariantCulture)
Console.WriteLine("A case-insensitive comparison of {0} and {1}
is


_
{2}", string1, string2, compareResult)
End Sub
End Class



"Fred" wrote in message
news:%237Ibih$
> Bonsoir,
> Si c'est pareil que pour le VB, cela ne répond pas au problème.
> D'après ce que j'ai compris (et une solution "élégante" m'intéresse
> également), Pascal souhaite que "e" soit non seulement égal à "E" mais
> aussi
> à "é" et "è".
> Or l'option Compare Text du VB, sans doute équivalente à l'utilisation


du
> CultureInfo.InvariantCulture, donne bien "e"="E" mais "e"<"é", et même


si
> tous les caractères "e" accentués sont bien inférieurs à "f", cela me
> paraît
> difficilement exploitable pour conclure que "eeee" = "eéèê" par
> exemple.
>
>
> "Lloyd Dupont" a écrit dans le message de
> news:
>
>> Quid de lire la documentation?
>> bon chez moi j;ai que le framework en anglais alors chais pas si c'est
>> pareil en Francais mais:
>>
>> si je tape (aie) string.compare dans l'index j'obtiens:
>> Performing Culture insensitive string comparison !!!!
>>
>> using System.Globalization;
>>
>> public class CompareSample
>> {
>> public static void Main()
>> {
>> String string1 = "file";
>> String string2 = "FILE";
>>
>> int compareResult = String.Compare(string1, string2, false,
>> CultureInfo.InvariantCulture);
>> Console.WriteLine("A case-insensitive comparison of {0} and
>> {1}
>> is
>> {2}", string1, string2, compareResult);
>> }
>> }
>>
>>
>> "Faure-vincent Pascal" wrote in
> message
>> news:
>> > Bonjour
>> >
>> > Je n'arrives absolument pas à trouver une solution pour comparer 2
> chaines
>> > sans tenir compte des accents.
>> > Le framework doit surement résoudre cela facilement sans que l'on


fasse
>> > une méthode propriétaire.
>> > On m'a parlé d'utiliser la classe StreamBuilder pour encoder les 2
> chaines
>> > avec le même encodage mais je n'y arrives pas.
>> > Si quelqu'un peut m'aiguiller çà serait sympa.
>> > Merci d'avance
>> > pascal
>> >
>> >
>> >
>> >
>>
>>
>
>








Avatar
Sylvain Collange
Faure-vincent Pascal a écrit :
Je n'arrives absolument pas à trouver une solution pour comparer 2
chaines sans tenir compte des accents.
Le framework doit surement résoudre cela facilement sans que l'on
fasse une méthode propriétaire.



Le framework seulement ne le permet pas, mais sous NT on peut utiliser
l'API FoldString pour convertir les lettres accentuées en lettre de
base + accent combinant, puis éliminer les accents combinants.
Ça donne quelque chose comme :

string strComposite = new string('', buffSize);
FoldString(MAP_COMPOSITE, strSource, strSource.Length, strComposite,
buffSize);
strComposite.TrimEnd('');

StringBuilder unaccentedString = new StringBuilder();
foreach(char c in strComposite)
{
if(char.GetUnicodeCategory(c) != UnicodeCategory.ModifierLetter)
unaccentedString.Append(c);
}

Et ensuite on n'a plus qu'à comparer les deux chaînes «
désaccentuées ».

Inconvénient : ça ne marche pas sous Windows 9x.

--
Sylvain Collange
Avatar
Faure-vincent Pascal
merci mais je préfère utiliser uniquement du code managée
mais merci quand même
pascal



"Sylvain Collange" a écrit dans le message de
news:
Faure-vincent Pascal a e?crit :
Je n'arrives absolument pas à trouver une solution pour comparer 2
chaines sans tenir compte des accents.
Le framework doit surement résoudre cela facilement sans que l'on
fasse une méthode propriétaire.



Le framework seulement ne le permet pas, mais sous NT on peut utiliser
l'API FoldString pour convertir les lettres accentue?es en lettre de base
+ accent combinant, puis e?liminer les accents combinants.
C?a donne quelque chose comme :

string strComposite = new string('', buffSize);
FoldString(MAP_COMPOSITE, strSource, strSource.Length, strComposite,
buffSize);
strComposite.TrimEnd('');

StringBuilder unaccentedString = new StringBuilder();
foreach(char c in strComposite)
{
if(char.GetUnicodeCategory(c) != UnicodeCategory.ModifierLetter)
unaccentedString.Append(c);
}

Et ensuite on n'a plus qu'a` comparer les deux chai^nes «
de?saccentue?es ».

Inconve?nient : c?a ne marche pas sous Windows 9x.

--
Sylvain Collange