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