IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Supprimer les accents d'une chaîne [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Supprimer les accents d'une chaîne
    Bonjour,

    je cherche un moyen de supprimer tous les accents d'une chaîne de caractères.
    J'ai trouvé des fonctions pour Delphi, mais je n'ai rien trouvé jusqu'alors qui fonctionne sous Lazarus.

    Quelqu'un a-t-il une solution ?

    Merci d'avance.
    Ben
    Dernière modification par Alcatîz ; 22/01/2017 à 14h22. Motif: préfixe

  2. #2
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 26
    Par défaut
    Salut,

    j'ai regardé pour t'aider mais il y a un soucis avec les chaines de caractères sous Lazarus...

    si je fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Showmessage(chaine[i]);
    avec chaine et i bien initialisés et bien ça donne une boite de dialogue vide...

    Edit: ah non, c'est les accents qui posent problème sinon chaine[i] fonctionne...

  3. #3
    Invité
    Invité(e)
    Par défaut
    je n'ai pas constaté de problème de ce genre.

    je viens de tester ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button1Click(Sender: TObject);
    var
      long,
        i: Integer;
    begin
         long := Length(Edit1.Text);
         Caption := '';
         for i := 1 to long do
         begin
           Caption := Caption + Edit1.Text[i];
         end;
    end;
    tous les caractères sont bien repris.

  4. #4
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 26
    Par défaut
    effectivement avec un TEdit ça fonctionne...

    essaye ça alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      showmessage(enleveaccents('éàèù'));
    end;
     
    function TForm1.EnleveAccents(AText : String) : string;
    const
      Char_Accents      = 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ';
      Char_Sans_Accents = 'AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn';
    var
      I, J : Integer;
      sTemp : String;
    begin
      sTemp :=AText;
      showmessage(stemp);
      showmessage(stemp[2]);
      For i := 1 to Length(sTemp) do
        //sTemp := FastReplace(sTemp, Char_Accents[i], Char_Sans_Accents[i]);
        sTemp := StringReplace(sTemp,Char_Accents[i],Char_Sans_Accents[i],[rfReplaceAll]);
      Result := sTemp;
    end;
    c'est pas de moi je l'ai trouvé sur ce forum

    chez moi ça donne 'A?A?A'...

    Edit: ça donne 'éàèù', rien (boite vide) puis 'A?A?A'

  5. #5
    Invité
    Invité(e)
    Par défaut
    bonjour,

    il me semble que j'avais tester une méthode de ce type et que j'avais eu des résultats du même genre que quoi...
    je vais refaire des tests ce soir.

    ben

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 176
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Le sujet avait été traité, par exemple, dans cette discussion :
    http://www.developpez.net/forums/d14...ne-fonctionne/

    Je viens de tester rapidement la solution que j'avais proposée à l'époque mais j'ai l'impression qu'elle ne fonctionne plus avec Lazarus 1.6.2.

    Malheureusement je n'ai pas le temps de me pencher davantage sur le problème aujourd'hui. En espérant vous avoir mis quand même sur la piste d'une solution...

  7. #7
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Bonjour,

    Voici la fonction que j'utilise (posté dans sources/tri stringlist)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    function RemoveAccent(S: string): string;
    {remplacement des caractères accentués dans la table UTF8 LATIN BASIC}
    {En UTF8, les caractères accentués sont codés sur 2 octets :
       le premier = $C3
       le deuxième : de $80 à $BF }
     
    var
      i: integer;
      ch: char;
    begin
       if Length(S) = 0 then
       begin
          Result:= S;
          Exit;
       end;
       i:= 1;
       repeat
          if byte(S[i]) = $C3 then
          begin
            ch:= #0;
            case byte(S[i+1]) of
              $80..$86 : ch:= 'A';
              $87      : ch:= 'C';
              $88..$8B : ch:= 'E';
              $8C..$8F : ch:= 'I';
              $92..$96 : ch:= 'O';
              $98      : ch:= 'O';
              $99..$9C : ch:= 'U';
              $9D      : ch:= 'Y';
              $A0..$A6 : ch:= 'a';
              $A7      : ch:= 'c';
              $A8..$AB : ch:= 'e';
              $AC..$AF : ch:= 'i';
              $B2..$B6 : ch:= 'o';
              $B8      : ch:= '0';
              $B9..$BC : ch:= 'u';
              $BD, $BF : ch:= 'y';
            end;
            if ch <> #0 then
            begin
              Delete(S,i,1); // effacement du premier octet
              S[i]:= ch;     // remplacement du 2° octet
            end;
          end;
          Inc(i);
       until i > length(s);
       Result:= S;
    end;
    Cordialement
    Thierry

  8. #8
    Membre émérite

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bonjour !

    Le sujet avait été traité, par exemple, dans cette discussion :
    http://www.developpez.net/forums/d14...ne-fonctionne/

    Je viens de tester rapidement la solution que j'avais proposée à l'époque mais j'ai l'impression qu'elle ne fonctionne plus avec Lazarus 1.6.2.
    A partir de Lazarus 1.6 et FPC 3.0 il ne faut plus utiliser AnsiToUTF8 ou UTF8ToAnsi pour convertir explicitement une chaîne entre Ansi et UTF8.

    A la place il faut utiliser WinCPToUTF8 et UTF8ToWinCp de l'unité LazUtf8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Uses LazUTF8;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      avant, apres, temp: string;
      i: integer;
    begin
      avant := UTF8ToWinCP('àéèê');
      apres := UTF8ToWinCP('aeee');
     
      temp := UTF8ToWinCP(Memo1.Lines.Text);
     
      for i := 1 to Length(avant) do
        temp := StringReplace(temp, avant[i], apres[i], [rfReplaceAll]);
     
      Memo1.Lines.Text := WinCPToUTF8(temp);
    end;

    Citation Envoyé par ThWilliam
    {En UTF8, les caractères accentués sont codés sur 2 octets :
    le premier = $C3
    le deuxième : de $80 à $BF }
    Faux en ce qui concerne 'Ÿ' (majuscule) qui ne commence pas par $C3 mais est codé #$C5#$B8

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 184
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 184
    Par défaut
    bonjour,

    et chaque fois que je vois ce genre de question, je me pose la même question : mais pourquoi ?

    À partir du moment où l'accent a pleine valeur orthographique, pourquoi vouloir le(s) supprimer ?
    Une praline et un praliné, ce n'est pas la même chose, alors si quelqu'un pouvait m'expliquer...

    Parce que sans accents ça risque d'être top, dans une BdD de stock, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Réf. Article Qté
    126  Praline  27
    512  Praline  18

  10. #10
    Rédacteur

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par Jipété Voir le message
    À partir du moment où l'accent a pleine valeur orthographique, pourquoi vouloir le(s) supprimer ?
    Bonjour Jipété,

    Tu as entièrement raison s'il s'agit de l'affichage des chaînes, mais leur traitement est parfois simplifié si les caractères accentués sont ramenés à des caractères présents dans le corps originel ASCII. Je pense notamment au tri alphabétique : essaye de trier directement des mots accentués avec Lazarus .

    PS : Je précise que Delphi trie correctement sans ce subterfuge.
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  11. #11
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 184
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 184
    Par défaut
    Bonjour Gilles,
    Citation Envoyé par gvasseur58 Voir le message
    Tu as entièrement raison s'il s'agit de l'affichage des chaînes, mais leur traitement est parfois simplifié si les caractères accentués sont ramenés à des caractères présents dans le corps originel ASCII.
    Je te laisse imaginer les subterfuges à mettre en œuvre avec les mots modelé et modèle, tu vas te retrouver avec deux fois modele et attention les doublons, nécessaires cette fois !
    Bonjour la prise de tête, car ça va obliger à quand même stocker la string accentuée pour l'afficher (et l'imprimer [factures, devis...]) correctement, hé oui...

    OK, je ne connais rien aux BdD, mais je sais quand même qu'il y a des index (numériques, je suppose), et que le traitement serait grandement simplifié en les utilisant plutôt que de jongler avec modele01, modele02, ou praline01 praline02...

    Bon courage à ceux qui doivent s'y coller !

  12. #12
    Invité
    Invité(e)
    Par défaut
    jurassic pork, merci pour ta solution, je vais tester ça

    Jipété il y a de nombres raison de vouloir supprimer ce type de caractères.
    j'en ai besoin ici pour renommer des noms de fichiers. il y a encore de nombreux cas où les fichiers contenant des accents posent problème.

    encore merci à tous pour vos réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/08/2015, 23h47
  2. Supprimer les accents dans une chaîne
    Par SuperChafouin dans le forum Langage
    Réponses: 4
    Dernier message: 17/12/2007, 18h28
  3. Remplacer les accents dans une chaîne
    Par mathieumg dans le forum C
    Réponses: 9
    Dernier message: 23/07/2006, 16h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo