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 :

Mettre en majuscule un caractère accentué [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Mettre en majuscule un caractère accentué
    Bonjour !

    J'aurais besoin d'une fonction qui remplacerait le premier caractère d'une chaîne par une majuscule, y compris les caractères accentués.

    Quelle serait la version correcte du code suivant ?

    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
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        procedure FormCreate(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    function Majuscule(s: string): string;
    begin
      result := s;
      if result[1] = 'î' then
        result[1] := 'Î'; // Error: Incompatible types: got "Constant String" expected "Char"
    end;
     
    { TForm1 }
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Edit1.Text := 'île';
      Edit2.Text := Majuscule(Edit1.Text);
    end;
     
    end.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Quelle serait la version correcte du code suivant ?
    Peut-être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    uses LazUTF8;
     
    function Utf8LeftStr(const AText: String; const ACount: Integer): String;
    begin
      Result := Utf8Copy(AText, 1, ACount);
    end;
     
    function Majuscule(s: AnsiString): AnsiString;
    begin
      result := s;
      if Utf8LeftStr(result, 1) = 'î' then
        result := Utf8UpperCase(Utf8LeftStr(result, 1)) + Utf8Copy(result, 2, Length(result));
    end;
    que j'avais dans un coin.

    Testé avec ton "île", fonctionne.

  3. #3
    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,

    A mon avis, le problème est dû au fait que Lazarus travaille en interne en UTF8. "Î" en UTF8 est codé sur au moins 2 octets.
    s:=UpperCase(Copy(s,1,1))+Copy(s,2,MaxInt); devrait marcher si "UTF8 dans la RTL" est défini pour le projet, sans cela il faudrait sans doute utiliser les versions UTF8UpperCase et UTF8Copy des fonctions de l'unité LazUtf8. Les joies de l'UTF8

    André

    Edit: trop tard

    PS: UTF8Leftstr est déjà défini dans LazUtf8

  4. #4
    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
    Merci pour vos réponses fort instructives.

    Je confirme que chez moi (Lazarus 1.4.2, Windows) les solutions Jipété-alanglet et ThWilliam fonctionnent parfaitement. En revanche, la solution proposée par tourlourou ne paraît pas fonctionner (même si l'idée des deux chaînes est intéressante). C'est peut-être lié à la version du compilateur ?

    Citation Envoyé par alanglet Voir le message
    si "UTF8 dans la RTL" est défini pour le projet
    Comment fait-on pour activer cette option ?

  5. #5
    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
    Bonsoir,

    Citation Envoyé par Roland Chastain Voir le message
    Comment fait-on pour activer cette option ?
    Lazarus 1.5 et fpc 3.1.1 mis à jour depuis trunk SVN. Options du compilateur pour le projet.
    (Retraité, sans rien à vendre, on peut prendre des risques).

    André

  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
    Citation Envoyé par alanglet Voir le message
    Lazarus 1.5 et fpc 3.1.1 mis à jour depuis trunk SVN. Options du compilateur pour le projet.
    Ah, d'accord. Donc si je comprends bien il sera possible, avec Free Pascal 3, de continuer à utiliser l'ancienne version de la RTL.

    Quoique je n'aie rien à vendre non plus, je n'ai pas encore essayé le nouveau compilateur : je laisse les autres essuyer les plâtres.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    En revanche, la solution proposée par tourlourou ne paraît pas fonctionner (même si l'idée des deux chaînes est intéressante). C'est peut-être lié à la version du compilateur ?
    Nan, c'est lié à la longueur des [EDIT]chaînes caractères[/EDIT], codés sur deux octets pour tout ce qui n'est pas ASCII pur et dur (et parfois sur trois octets -- mais je ne me souviens plus dans quels cas)...

    La souris sur les mots qui vont bien en mode pas-à-pas :

    Nom : minus-majus.jpg
Affichages : 1412
Taille : 35,7 Ko

  8. #8
    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
    Merci, Jipété, pour cette explication. Honnêtement (je ne sais pas si c'est l'heure tardive) je ne vois pas très bien à quoi correspondent ces nombres entre accolades. Mais bon le coup des deux octets j'ai compris.

    Pour le plaisir de prolonger la discussion (quoique mon problème soit résolu), voici ce que je voulais faire en réalité. C'est une fonction qui ajoute des majuscules, de façon "intelligente", à des noms de pays donnés tout en minuscules. Le code est sûrement optimisable (et il y a peut-être aussi des cas que j'ai oublié de prendre en compte), mais la fonction fait le travail.

    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
    function Majuscules(s: string): string;
    var
      i: integer;
    begin
      for i := 1 to UTF8Length(s) do
        if
        (
          (i = 1) or
          (UTF8Copy(s, i - 1, 1) = ' ') or
          (UTF8Copy(s, i - 1, 1) = '''') or
          (UTF8Copy(s, i - 1, 1) = '-')
        )
        and not
        (
          (UTF8Copy(s, i, 2) = 'd''') or
          (UTF8Copy(s, i, 2) = 'du') or
          (UTF8Copy(s, i, 2) = 'et') or
          (UTF8Copy(s, i, 3) = 'les')
        )
        then
          s := UTF8Copy(s, 1, i - 1) + UTF8UpperCase(UTF8Copy(s, i, 1)) + UTF8Copy(s, i + 1, MAXINT);
      result := s;
    end;
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  9. #9
    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
    Citation Envoyé par Roland Chastain Voir le message
    Donc si je comprends bien il sera possible, avec Free Pascal 3, de continuer à utiliser l'ancienne version de la RTL.
    La liste des fonctions qui seront prises en compte figure http://wiki.freepascal.org/FPC_Unico...rt#RTL_changes. Mais d'après ce que j'ai compris, seules celles concernant les échanges avec le SE comme l'adressage des fichiers tiennent actuellement compte de la différence de codage des caractères. Copy ne semble pas l'être encore. Il faut donc encore utiliser s:=UTF8UpperCase(UTF8Copy(s,1,1))+UTF8Copy(s,2,MaxInt); de LazUtf8 pour le moment.
    Dans la dernière version de LazUtf8 on trouve une directive inline pour
    function UTF8ToSys(const s: string): string; overload; {$IFDEF EnableUTF8RTL}inline;{$ENDIF}mais pas pour
    function UTF8Copy(const s: string; StartCharIndex, CharCount: PtrInt): string;Pour l'UTF8 un coup d'œil https://fr.wikipedia.org/wiki/UTF-8 nous apprend qu'un caractère peut être codé sur 1 à 4 octets.

    Bonne nuit.
    André

  10. #10
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Bonjour Roland,

    Il serait peut-être plus simple d'utiliser 2 chaînes constantes pour les minuscules à remplacer et les majuscules correspondantes et faire un Pos() :
    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
    const
      sMinus = 'àéè';
      sMajus = 'ÀÉÈ';
     
    function Majuscule(s: string): string;
    var
      i: integer;
    begin
      result := s;
      if result > EmptyStr then
      begin
        i := Pos(result[1], sMinus);
        if i > 0 then
          result[1] := sMajus[i];
      end;
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  11. #11
    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 à tous.

    J'ai trouvé cette fonction sur un forum lazarus-freepascal (conversion en widestring):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function UTF8UpperFirstLetter(Value: string): string;
    var
      temp: WideString;
    begin
      temp:= UTF8Decode(Value);
      if length(temp) > 0 then temp[1]:= WideUpperCase(temp[1])[1];
      Result:= UTF8Encode(temp);
    end;
    lien: http://forum.lazarus.freepascal.org/...p?topic=6219.0

    Ok sous windows. Pas testé sous Linux.

    Cordialement
    Thierry

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

Discussions similaires

  1. [XL-2007] Mettre des chaines de caractères en majuscules
    Par jords dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/07/2012, 09h11
  2. Réponses: 8
    Dernier message: 11/05/2012, 10h25
  3. Mettre en majuscule certain caractère d'une chaîne
    Par saket2114 dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2009, 15h38
  4. Mettre en majuscule un caractère précis
    Par mdr_cedrick dans le forum Langage
    Réponses: 9
    Dernier message: 10/12/2008, 16h31
  5. [RegEx] Mettre en majuscules les premières lettres accentuées
    Par Bibicmoi dans le forum Langage
    Réponses: 8
    Dernier message: 15/05/2006, 19h02

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