Comparaison de strings sans tenir compte des accents [Résolu]

Signaler
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
-
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
-
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

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
28
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.
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
Hé oui, si Delphi lui-même n'a pas d'autre solution...
je ne me casse plus la tête !

Merci à toi, Delphiprog
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
1
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
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
Salut Florent,

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

A +
Thierry