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 :

Problème d'encodage avec une fonction mettant des majuscules aux prénoms [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut Problème d'encodage avec une fonction mettant des majuscules aux prénoms
    Bonjour à tous,


    j'ai développé depuis certain temps un logiciel permettant de saisir des relevés d'actes pour des besoins généalogiques (BD SQLITE-3 récemment revu avec Lazarus 2.24 W10 64 bits ) et ai construit une fonction permettant de passer en majuscules la première lettre de chacun des prénoms dont vous trouverez ci-joint le code :
    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
    Function MajuscPrenom (RefPrenom : String) : String;    // majuscule dans les prénoms
     Var i, k : Integer ;
     Begin
     k :=  length(RefPrenom)  ;  // k : nb de caractères du prénom complet
     // passage en minuscule de toutes les letttres
      For i := 1 to k Do
          Begin
       RefPrenom[i] := LowerCase(RefPrenom[i]) ;
          end;
     //Passage en majuscules des lettres appropriées
      if k > 0  Then
      RefPrenom[1] := UpCase(RefPrenom[1]) ;
        For i := 2 to k Do
        Begin
          if RefPrenom[i-1] = ' ' Then RefPrenom[i] := UpCase(RefPrenom[i]) ;
          if Refprenom[i-1] = '-' Then RefPrenom[i] := UpCase(RefPrenom[i]) ;
        end;
          MajuscPrenom := RefPrenom ;
     
     End;
    Cette fonction remplit son office mais j'ai relevé récemment une curiosité qui est la suivante :
    Lorsque le prénom complet est composé de plusieurs prénoms par exemple : Hélène Thérèse le résultat de la saisie est : " Hélène Thérèse ", si l'on saisit "Hélène Therese" le résultat de la saisie est "Hélène Therese".
    Si l'on consulte la base à l'aide de SQliteAdmin le contenu du champ est dans le cas de la saisie de Hélène THerese : " Hélène Therese ".

    Dans les anciennes versions du logiciel j'utilisais la fonction de Transcodage UTF8ToANSI (Upcase(... pour obtenir un affichage écran lisible. J'ai essayé WinCPToUTF8 comme il m'avait été recommandé dans une précédente discussion mais le résultat est le même. La question est : Pourquoi lorsque le prénom est composé de plusieurs dont chacun contient des caractères accentués l'affichage est incorrect alors que lorsqu'il y a un seul prénom avec plusieurs caractères accentués (Hélène par exemple) l'affichage est correct ?

    Personnellement cela ne me gêne pas beaucoup car, par la suite, pour récupérer les données dans le cadre de l'association pour laquelle je saisis les actes je suis obligé d'exporter la base au format CSV ce qui, à l'aide de Notepad me permet de rétablir un affichage compatible avec Windows.

    Si quelqu'un peut se pencher sur la question Merci

    R.O.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 261
    Par défaut
    Bonjour,

    Je pense qu'en utilisant la version UTF8 des fonctions de chaînes de caractères et en prenant en compte le fait qu'en UTF8 un caractères peut occuper plusieurs octets (ne pas utiliser s[i] par exemple pour sélectionner le ième caractère, mais la fonction UTF8 correspondante), vous devriez pouvoir résoudre votre problème.

    André

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut suite -encodage
    Bonsoir,

    Merci pour votre réponse. Qu'entendez-vous par "utiliser la version UTF8 des fonctions de chaînes de caractères" ? J'ai déjà placé LazUTF8 dans les "Uses" du programme.
    Merci

    R.O.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 261
    Par défaut
    Mettre LazUTF8 dans les Uses ne modifie pas les fonctions existantes comme length, LowerCase etc...
    Il faut les remplacer par les fonctions équivalentes définies dans LazUTF8, comme UTF8Length, UTF8LowerCase, UTF8UpperCase...
    La liste de ces fonctions existe en tête de LazUTF8.pas

    André

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 224
    Par défaut
    Hello,
    il y a une chose que je ne comprend pas dans ta fonction. Pourquoi tu mets ta chaîne en minuscule, caractère par caractère alors que tu pourrais tout mettre en minuscule en une seule fois comme ceci par exemple :
    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
    Function MajuscPrenom (RefPrenom : String) : String;    // majuscule dans les prénoms
     Var i, k : Integer ;
     Begin
     k :=  length(RefPrenom)  ;  // k : nb de caractères du prénom complet
     RefPrenom := LowerCase(RefPrenom) ;
     //Passage en majuscules des lettres appropriées
      if k > 0  Then
      RefPrenom[1] := UpCase(RefPrenom[1]) ;
        For i := 2 to k Do
        Begin
          if RefPrenom[i-1] = ' ' Then RefPrenom[i] := UpCase(RefPrenom[i]) ;
          if Refprenom[i-1] = '-' Then RefPrenom[i] := UpCase(RefPrenom[i]) ;
        end;
      MajuscPrenom := RefPrenom ;
     
     
     End;
    D'autre part on peut réaliser la fonction avec les expressions régulières en utilisant la fonction ReplaceRegExpr comme ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    implementation
    uses   Regexpr;
    {$R *.lfm}
    { TForm1 }
    procedure TForm1.Button3Click(Sender: TObject);
    begin
       Memo1.Append(ReplaceRegExpr('([^ -]+)',LowerCase(Edit1.Text),'\u$1',True));
    end;
    Le motif ([^ -]+) consiste à capturer les groupes d'au moins un caractère qui n'est ni un espace, ni un tiret.
    Le motif de substitution \u$1 consiste à mettre en majuscule le premier caractère d'un groupe capturé.
    Le True à la fin, permet de dire que le motif de substitution est un modèle (pas la chaîne elle-même).

    Nom : LazFirstCap.gif
Affichages : 225
Taille : 78,0 Ko

    Ami calmant, J.P

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 167
    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 167
    Billets dans le blog
    9
    Par défaut
    Bonjour tout le monde !

    Dans les exemples utilisés, les prénoms commencent par des consonnes ou par des voyelles non accentuées. Essayez par exemple Églantine : vous verrez qu'il y a des solutions qui ne fonctionnent pas.

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

Discussions similaires

  1. Encodage de cd en fichier mp3
    Par clovis dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 08/04/2004, 01h13
  2. [ENCODAGE][JAVA]Afficher correctement des accents
    Par kornelius dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/02/2004, 16h37
  3. prbl auto-incrémente
    Par cb dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/11/2003, 11h32
  4. Encodages DOS et Windows
    Par Aramis dans le forum Langage
    Réponses: 5
    Dernier message: 09/11/2003, 17h55
  5. [VB6] fonction d' encodage URL en VB
    Par jeanseb dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/01/2003, 11h16

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