Les filtres et les accents

beroyak Messages postés 7 Date d'inscription vendredi 23 février 2007 Statut Membre Dernière intervention 16 août 2010 - 15 juin 2010 à 14:24
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 - 8 juil. 2010 à 15:18
Bonjour!
J'ai un problème avec les accents lors du filtrage avec un Tdataset.
En effet à l'instar de la casse (majuscule minuscule) je veux rendre mes filtres insensibles aux accents. exple

bâteau ---> bateau
collège --->college

14 réponses

cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
6 juil. 2010 à 13:43
Bonjour,

Tiens voiçi un filtre simple et rapide :

const
SansAccents : array[Char] of Char
= #0#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15 +
#16#17#18#19#20#21#22#23#24#25#26#27#28#29#30#31 +
' !"#$%&''()*+,-./0123456789:;<=>?' +
'@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'+
'`abcdefghijklmnopqrstuvwxyz{|}~'#127 +
'?'#129'????????S??'#141'?'#143#144'?????????s??'#157'zY' +
#160'¡¢£€¥Š§š©ª«¬*®¯°±²³Žµ¶·ž¹º»ŒœŸ¿' +
'AAAAAAÆCEEEEIIIIDNOOOOO×ØUUUUYÞß' +
'aaaaaaæceeeeiiiidnooooo÷øuuuuyþy';

function EnleveAccents(const AText : String) : string;
var
i:integer;
p:pchar;
begin
Result:=AText;
if Result='' then EXIT;
p:=@Result[1];
for i:=1 to Length(Result) do begin
p^:=SansAccents[p^];
inc(p);
end;
end;

A+.
1
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
15 juin 2010 à 14:30
Salut,
tu peux créer une fonction "Filtrer(var Str: String);". Tu l'appelles comme ça :

// chaine pas filtrée
Filtre(machaineafiltrer)
// la chaine est filtrée maintenant


Dans la fonction, tu parcours chaque caractère de la chaîne à la recherche de "ê, é, è, ..." et tu remplaces ça par "e". Pareil pour "à, â", ... Y'a ptet déjà une fonction qui fait ce que tu veux dans SysUtils ou StrUtils, cherche bien ?

Cordialement, Bacterius !
0
beroyak Messages postés 7 Date d'inscription vendredi 23 février 2007 Statut Membre Dernière intervention 16 août 2010
15 juin 2010 à 16:07
merci pour la réponse!
Mais ce que je voulais. je parle du filtre des TTable.
En fait j'ai une liste de prénom dans ma base de données. lorsque rechercher je saisi dans mon filtre par exple "ge" que je dois avoir
gérard
gérôme
geoffroy
germain
etc.
Mais actuellement je n'ai que:
geoffroy
germain

j'utilise Delphi 7 avec Mysql 5.1 et les composants BDE de delhpi
merci de me répondre

Merci
0
cs_47 Messages postés 197 Date d'inscription mardi 20 janvier 2004 Statut Membre Dernière intervention 20 février 2013 1
15 juin 2010 à 18:41
Bonsoir,

je n'ai pas utilisé delphi depuis longtemps ... mais si tu peux mettre une requete SQL dans le composants filtre, tente (en modifiant selon tes champs):
SELECT * FROM `leNomDeTaTable` WHERE `leChamps` LIKE CONVERT(_utf8 '%ge%' USING utf8) COLLATE utf8_general_ci (testé sous phpmyadmin, mysql 5.0)



bonne soirée
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
6 juil. 2010 à 14:06
Salut,
Pseudo3, ta fonction ne marche pas. Elle retourne incorrectement des "a" et des "o" à la place des "e" et des "a" ... ça vient du filtre qui est incorrect. Voici une version plus optimisée et qui fonctionne (n'ayez pas peur du gros tableau, c'est presque équivalent à celui de Pseudo3 à la différence qu'il utilise des octets au format hexadécimat et qu'il fonctionne).

const
 Filter: array [Byte] of Byte = (
 $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B, $0C, $0D, $0E, $0F,
 $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $1A, $1B, $1C, $1D, $1E, $1F,
 $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $2A, $2B, $2C, $2D, $2E, $2F,
 $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $3A, $3B, $3C, $3D, $3E, $3F,
 $40, $41, $42, $43, $44, $45, $46, $47, $48, $49, $4A, $4B, $4C, $4D, $4E, $4F,
 $50, $51, $52, $53, $54, $55, $56, $57, $58, $59, $5A, $5B, $5C, $5D, $5E, $5F,
 $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $6A, $6B, $6C, $6D, $6E, $6F,
 $70, $71, $72, $73, $74, $75, $76, $77, $78, $79, $7A, $7B, $7C, $7D, $7E, $7F,
 $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $8A, $8B, $8C, $8D, $8E, $8F,
 $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $9E, $9F,
 $A0, $A1, $A2, $A3, $A4, $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC, $AD, $AE, $AF,
 $B0, $B1, $B2, $B3, $B4, $B5, $B6, $B7, $B8, $B9, $BA, $BB, $BC, $BD, $BE, $BF,
 $41, $C1, $41, $41, $41, $C5, $C6, $C7, $45, $C9, $45, $45, $49, $CD, $49, $49,
 $D0, $D1, $D2, $D3, $D4, $D5, $D6, $D7, $D8, $D9, $DA, $DB, $DC, $DD, $DE, $DF,
 $61, $E1, $61, $61, $61, $E5, $E6, $E7, $65, $65, $65, $65, $69, $ED, $69, $69,
 $F0, $F1, $F2, $F3, $F4, $F5, $F6, $F7, $F8, $75, $FA, $75, $75, $FD, $FE, $79);


procedure EnleveAccents(var AText: String);
var
 P: PByte;
 E: Pointer;
begin
 P := @AText[1];
 E := Ptr(Integer(P) + Length(AText));
 while P <> E do
  begin
   P^ := Filter[P^];
   Inc(P);
  end;
end;

// Utilisation

Chaine := 'éléphant à tribord';
EnleveAccents(Chaine);
// Maintenant Chaine = 'elephant a tribord'


Notez que j'ai refait le filtre vite fait, il manque probablement des correspondances mais l'essentiel est là.

Cordialement, Bacterius !
0
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
6 juil. 2010 à 16:17
Salut Bactérius,

Tu dis "Pseudo3, ta fonction ne marche pas". Mais elle a marché chez moi. A moins que je ne me sois planté lors du choix de sa version (je l'avais planquée dans plusieurs applis dont certaines étaient des bidouillages pour des tests dont une de cryptage-décriptage simplissime).

Mais l'essentiel est que ta version plus optimisée marche également.

Pour ce qui est de la vitesse qui résulte de l'utilisation conjointe de la constante et des pointeurs je tiens à signaler que lors de la mise au point de la routine EnleveAccents il y avait dans la compétition une version en Asm qui n'avait pas réussi à détrôner celle avec les PChar.

Au fait, l'utilisation de la NewGint de KR85 ça roule ???

A+.
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
7 juil. 2010 à 05:56
Salut,
non, chez moi j'ai copié le truc sur Delphi 6, le filtre ne compilait pas, j'ai corrigé du mieux que je pouvais et ça a échoué quand même. Mais bon pas grave. En fait mon code est plus optimisé car on zappe une boucle for, qui nécessite d'incrémenter "i" en même temps que "p" à chaque itération. Alors que ma méthode, il suffit de calculer "E" une bonne fois pour toutes et ça fonce. Mais de toute façon le gain est négligeable pour des si petites chaînes, quelques microsecondes tout au plus.

Au fait, l'utilisation de la NewGint de KR85 ça roule ???

Ben je m'en sers pas trop en ce moment mais je l'ai dans mon dossier Lib et j'ai pas encore eu d'erreur

Cordialement, Bacterius !
0
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
7 juil. 2010 à 10:59
Salut,

1) Accents : Bizarre que le filtre ne compilait pas sur Delphi 6. Moi j'utilise Delphi 5 et en principe la table des caractères est la même : Mystère et boule de gomme.
Tu dis "En fait mon code est plus optimisé" : Oui effectivement et en particulier du fait que ta routine est une procédure et que la mienne est une fonction ce qui est intéressant à la fois pour la vitesse et l'occupation-mémoire.

2) NewGint : Tu dis "... et j'ai pas encore eu d'erreur". Eh bien c'est une bonne nouvelle. Merci.

3) Remplissage d'une courbe de Béziers : A toutes fins utiles je te signale que j'ai ajouté le code d'une solution plus simple dans la rubrique ouverte par Barbichette ... si le sujet t'intéresse toujours. Il reste cependant améliorable car ScanLine m'a joué un tour ce qui m'a obligé à ré-utiliser Pixels[]

Cordialement, Gilbert et A+.
0
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
7 juil. 2010 à 11:57
Re-Salut,

Pendant que le sujet est chaud : j'ai vite fait un test comparatif :

a) Texte avec Accents :
aéèçàêëù âêîôû äëïöü ÄËÏÖÜ ÂÊÎÔÛ
1234567890
azertyuiop$%mlkjhgfdsqwxcvbn,;:!*

b) Résultat de la conversion avec ma fonction :
aeecaeeu aeiou aeiou AEIOU AEIOU
1234567890
azertyuiop$%mlkjhgfdsqwxcvbn,;:!*

c) Résultat de la conversion avec ta procedure :
aeeçaeeu aeiôu aeiöu AEIÖÜ AEIÔÛ <-- il reste qq accents
1234567890
azertyuiop$%mlkjhgfdsqwxcvbn,;:!*

Pour l'essentiel les deux routines fonctionnent sous Delphi-5, il ne reste plus qu'à rectifier la const Filter.

Cordialement, Gilbert, et à +.
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
7 juil. 2010 à 12:25
Oui, j'en ai oublié quelques unes (c'est assez pénible de faire ce genre de charset ).

Cordialement, Bacterius !
0
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
8 juil. 2010 à 10:56
Bonjour,

En fait, pour être complet :

Liste des caractères accentués et voyelles doubles : ŠŒšœŸÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝàáâãäåæçèéêëìíîïðñòóôõöøùúûü

Résultat de sa conversion avec la const Filter actuelle :
ŠŒšœŸAÁAAAÅÆÇEÉEEIÍIIÐÑÒÓÔÕÖØÙÚÛÜÝaáaaaåæçeeeeiíiiðñòóôõöøuúuu

Cela va être chiant à rectifier vu que la const Filter array [Byte] est nettement moins lisible que la const SansAccents : array[Char]

Cordialement, Gilbert, et à +.
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
8 juil. 2010 à 11:19
Non ça vu, suffit de faire une boucle sur un bon charset sous forme de chaîne et convertir par programmation en bytes hexadecimal. Mais les deux marchent techniquement, c'est juste que je trouve que la notation hexadécimale est plus propre. C'est équivalent au niveau du code compilé.

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
8 juil. 2010 à 11:19
Oups, lire "non ça va"

Cordialement, Bacterius !
0
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
8 juil. 2010 à 15:18
Re-salut,

Tu dis
Mais les deux marchent techniquement, c'est juste que je trouve que la notation hexadécimale est plus propre.

Comme quoi tous les goûts sont dans la nature et moi je préfère l'array[Char] qui est directement lisible sans conversion. (flemme de convertir : lol)
Donc heureusement pour nous que les 2 marchent.

Cordialement, Gilbert, et à +.
0
Rejoignez-nous