Comparaison de strings sans tenir compte des accents

Résolu
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 - 12 avril 2008 à 16:21
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 - 15 avril 2008 à 18:33
Bonjour à tous.


Mon souci est de comparer deux strings sans tenir compte de la casse ni de l'accentuation.
Jusqu'à présent, j'utilisais une fonction qui met le texte en minuscules et  remplaçe  les voyelles accentuées par les voyelles normales.
En regardant l'implémentation de la fonction  AnsiCompareText, j'ai vu qu'elle employait la fonction Windows "CompareString".  En lui ajoutant le flag "NORM_IGNORENONSPACE", la comparaison ne tient plus compte de l'accentuation. Et c'est beaucoup plus rapide !
"ELEPHANT" = "éléphant".


Cela donne :


function MyAnsiCompareText(const S1, S2: string): Integer;
begin
  Result := CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE or  NORM_IGNORENONSPACE,
            PChar(S1), Length(S1), PChar(S2), Length(S2)) - 2;
end;


J'aimerais maintenant pouvoir faire une fonction qui détermine si une sous-chaine est présente dans une chaine.
Et donc trouver "elephant" dans "voici deux éléphants".
- L'idéal serait de voir si "AnsiContainsText" (unit StrUtils, je n'ai pas son code) utilise une fonction Windows et si cette fonction accepte un paramètre du genre "NORM_IGNORENONSPACE".
- Sinon, utiliser une fonction de transformation : j'ai vu la fonction Windows "LCMapString", mais je ne parviens pas en jouant avec les paramètres à retourner une chaine sans accents.
- sinon... je continuerai à utiliser ma propre fonction d'enlèvement d'accents (snif).


Merci d'avance


Thierry

4 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
12 avril 2008 à 19:10
Juste pour te permettre d'avancer, voici le code de la fonction AnsiContainsText :

function AnsiContainsText(const AText, ASubText: string): Boolean;
begin
  Result := AnsiPos(AnsiUppercase(ASubText), AnsiUppercase(AText)) > 0;
end;
Je t'endends déjà pousser un ouf de soulagement...

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
3
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
12 avril 2008 à 19:59
Hé oui, si Delphi lui-même n'a pas d'autre solution...
je ne me casse plus la tête !

Merci à toi, Delphiprog
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
14 avril 2008 à 16:49
Salut,

J'arrive un peu tard mais bon, si tu en as l'envie et le temps, tu peux jeter un oeil sur ces différents algorithmes de recherche de sous-chaîne sur Wikipedia : http://fr.wikipedia.org/wiki/Liste_des_algorithmes#Texte

Ils ne proposent rien quand aux accents mais permettent d'accélérer la recherche comparé aux fonctions de windows si tu fais ces tests dans une boucle, par exemple de la recherche de mots clés ou autre, où seul le texte change et pas la sous-chaîne.

Cela dit, je ne garantis rien..
A+
Flo
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
15 avril 2008 à 18:33
Salut Florent,

Merci pour ce lien qui semble très intéressant.

A +
Thierry
0
Rejoignez-nous