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 :

Gestion de l'UTF8 [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Invité
    Invité(e)
    Par défaut Gestion de l'UTF8
    Bonjour,

    je réalise un petit test sous Windows et LUbuntu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    showmessage(LeftStr('HÉLÈNE',4)+'-'+UTF8LeftStr('HÉLÈNE',4));
    donne
    Nom : utf801.PNG
Affichages : 174
Taille : 8,2 Ko
    et un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     showmessage(LeftStr('HÉLÈNE',5)+'-'+UTF8LeftStr('HÉLÈNE',5));
    produit :
    Nom : utf803.PNG
Affichages : 177
Taille : 2,6 Ko

    Ceci dit avec les commandes de LazUTF8, on a une inflation de code non négligeable : prendre les 2 caratères minuscules d'une chaine sans espace devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UTF8LeftStr(UTF8LowerCase(UTF8Trim(machaine,2))))
    Je me demandais s'il n'y avait pas une astuce pour simplifier tout cela. J'ai un vague souvenir sous Windows de créer la fiche en UTF8 sans BOM pour ne pas avoir à utiliser LazUTF8. J'ai réessayé... sans succès !

    Merci de votre aide. Cordialement. Gilles

  2. #2
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut,

    La RTL utilise par défaut la page de codes du système. Sous Windows, il s'agit d'un encodage non Unicode. Tandis que sous MacOS et Linux UTF-8 est utilisé.

    LeftStr renvoie un résultat erroné, car il utilise la fonction Copy qui copie octet par octet.
    Les caractères spéciaux et accentués en UTF-8 sont codés sur 2 octets.

    Pour que le résultat renvoyé soit bon, il faut faire LeftStr('HÉLÈNE',6) = HÉLÈ:

    H = 1 octet
    É = 2 octets
    L = 1 octet
    È = 2 octets

    1 + 2 +1 + 2 = 6

    et pour ton 2ème exemple, il faut donc faire LeftStr('HÉLÈNE',7) = HÉLÈN

    Essayes : showmessage(Length('HÉLÈNE').ToString + '-'+UTF8Length('HÉLÈNE').ToString); le résultat sera 8 - 6

    Si tu utilises des caractères accentués, il vaut mieux utiliser les fonctions disponibles dans "LazUTF8"

    Sinon tu peux tester mon unité BZTypesHelpers. Elle utilise LazUTF8 mais du coup son utilisation devient transparente. De plus cette unité contient pas mal d'autres méthodes qui seront peut-être utiles pour toi, pour la manipulation des chaines de caractères et des autres types standard. Il faut simplement déclarer cette unité à la fin des clauses uses (généralement dans la partie implementation)

    Le truc, avec BZTypesHelpers c'est que les fonctions sont "chainées" du coup

    Exemple : Length('HÉLÈNE') = 8 (qui renvoie un mauvais résultat) et UTF8Length('HÉLÈNE') = 6 deviendra ('HÉLÈNE').Length = 6

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      // fonctions chainées
      ShowMessage(('HÉLÈNE').Length.ToString); 
      ShowMessage(('HÉLÈNE').LeftOf(5).Length.ToString);
    L'avantage c'est que l'on tire partie de la complétion du code. On tape le '.' et la liste des méthodes disponibles s'affiche.

    Dedans, il y a la fonction function TStringHelper.LeftOf(Position: Integer): String; . Ton premier exemple s'écrira alors ('HÉLÈNE').LeftOf(5); = HÉLÈ
    Il n'y pas de fonction "LeftStr" mais elle sera facile à rajouter car identique à LeftOf (ça sera pour ma prochaine mise à jour )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function TStringHelper.LeftOf(Position: Integer): String;
    Begin
      Result := UTF8Copy(Self, 1, Position + 1);
    End;
     
    function TStringHelper.Left(Position: Integer): String;
    Begin
      Result := UTF8Copy(Self, 1, Position);
    End;
    Avec BZTypesHelpers, ton dernier exemple deviendra :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Result := machaine.Trim.ToLower.LeftOf(3);
    // ou
    Result := machaine.Trim.LeftOf(3).ToLower;
    // ou encore
    Result := machaine.ToLower.Trim.LeftOf(3);
    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Pour le fun ce qu'il est possible de faire avec BZTypesHelpers et les chaines de caractères

    Nom : 2020-08-24_132510.jpg
Affichages : 149
Taille : 109,8 Ko
    Nom : 2020-08-24_132542.jpg
Affichages : 154
Taille : 108,5 Ko
    Nom : 2020-08-24_132747.jpg
Affichages : 154
Taille : 96,6 Ko

    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    excellent... j'adopte !

    Merci. Gilles

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/02/2015, 15h34
  2. gestion des caractères spécifiques utf8
    Par knebhi dans le forum Langage
    Réponses: 4
    Dernier message: 04/06/2009, 22h34
  3. Réponses: 4
    Dernier message: 04/07/2002, 12h31
  4. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11
  5. gestion d'un joystick ...
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h53

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