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 :

Afficher ou écrire un caractère Unicode [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 375
    Par défaut Afficher ou écrire un caractère Unicode
    Bonjour à tous,

    Je suis un peu perdu pour afficher ou écrire des caractères unicodes simplement.
    Par exemple, les caractères de la série U+2680 affiche ici des dés:
    ⚀ ⚁ ⚂ ⚃ ⚄ ⚅
    Si je copie le caractère directement dans une chaine, mais comment travailler avec les codes U+2680 par exemple.

    Quelqu'un sait-il faire ? La doc est obscure sur le sujet, pas vu d'exemple de code...

    Merci

  2. #2
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour,

    Voici comment faire un "sept":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.Button1Click(Sender: TObject);
      var
      S1: UCS4String;
      S: string;
    begin
      SetLength(S1, 3);
      S1[0]:= UCS4Char($2681);
    S1[1]:= UCS4Char($2684);  
      S1[high(S1)]:= UCS4Char(0);   //Zéro dans le dernier élément de l'array
      S:= UCS4StringToUnicodeString(S1);
      Label1.Caption:= S;
    end;
    Ajouter LazUTF8 dans la clause uses.
    Le type UCS4String est un array terminé par un zéro. Il faut donc le dimensionner convenablement (nombre de caractères plus le zéro) et l'initialiser à zéro ou ajouter le zéro dans le dernier élément de l'array.

    bb84000

  3. #3
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 375
    Par défaut
    merci bien bb84000

    Je me doutais un peu de l'utilisation de LazUTF8, mais je pensais qu'il y avait peut être une nouvelle unité spéciale unicode!

    impéccable

  4. #4
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour,

    Citation Envoyé par Jlmat Voir le message
    merci bien bb84000

    Je me doutais un peu de l'utilisation de LazUTF8, mais je pensais qu'il y avait peut être une nouvelle unité spéciale unicode!

    impéccable
    En fait, l'unité nécessaire est StrUtils, pas lazUTF8, mais comme cette dernière appelle StrUtils, ça marche !

    bb84000

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 939
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 939
    Par défaut
    Label1.Caption:= #$2681#$2684 ne fonctionne pas sous Lazarus ?

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    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 173
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Label1.Caption:= #$2681#$2684 ne fonctionne pas sous Lazarus ?
    Non, chez moi (Lazarus 2.2.4, Linux) ça ne marche pas.

    L'exemple de bb84000 fonctionne, avec un avertissement.

    unit1.pas(44,5) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString"

  7. #7
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour,

    Citation Envoyé par Roland Chastain Voir le message
    L'exemple de bb84000 fonctionne, avec un avertissement :

    unit1.pas(44,5) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString"
    Le compilateur a raison. Dans le cas présent, il a correctement assuré la conversion, mais sans garantie d'un bon résultat pour d'autres valeurs ou d'autres configurations.
    J'aurais du écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // S:= UCS4StringToUnicodeString(S1);
    S:= UTF8Encode(UCS4StringToUnicodeString(S1));
    avant de l'assigner au label.

    bb84000

  8. #8
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour,

    Citation Envoyé par Andnotor Voir le message
    Label1.Caption:= #$2681#$2684 ne fonctionne pas sous Lazarus ?
    Ça donne deux magnifiques points d'interrogation.

    bb84000

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 939
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 939
    Par défaut
    OK ! UCS4StringToUnicodeString est manifestement différente de Delphi (il y aurait zéro conversion dans le cas présent). Peut-être une directive forçant l'UTF-16, ce qui pourrait peut-être expliquer l'avertissement que Roland reçoit au retour.

    Le sujet est résolu et je ne voudrais pas l'alourdir inutilement mais est-ce que ceci fonctionne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {$mode delphi}
    {$modeswitch unicodestrings}
    Label1.Caption:= #$2681#$2684;

  10. #10
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 375
    Par défaut
    Merci bb84000,

    Ok, tu reprends le même mécanisme, je trouve que c'est un peu lourd pour un seul caractère!

    J'avais espérer trouver une fonction existente... Mais c'est pas grave, en attendant mieux ou la prochaîne MAJ de Lazarus...

  11. #11
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour,

    Citation Envoyé par Jlmat Voir le message
    J'avais espérer trouver une fonction existante...
    Andnotor n'en était pas loin, et on s'est bien compliqué le vie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button1Click(Sender: TObject);
    var
      S2: UnicodeString;
    begin
     // S2:= #$2681+#$2684;     // Marche pas, c'est de l'utf16
     S2:= #$002681+#$002684;    // On force l'utf32 avec les zéros devant
      Label1.Caption:=S2 ;      // Et... sept !
    end;
    bb84000

  12. #12
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 939
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 939
    Par défaut
    Citation Envoyé par bb84000 Voir le message
    S2:= #$2681+#$2684; // Marche pas, c'est de l'utf16
    Les conversions implicites semblent assez étranges en Free Pascal parce que unicode est de l'utf-16

    Et ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    S2:= WideChar($2681) + WideChar($2684); // ou UnicodeChar()

  13. #13
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 375
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    ...parce que unicode est de l'utf-16
    Oui en effet, les définitions sont un peu partout! Je récapitule:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     var
      S2: UnicodeString;
     begin
      ...
      S2:= #$2681+#$2684;            //  => Marche pas (c'est de l'utf16?!)
      S2:= #$002681+#$002684;    //  => OK, On force l'utf32 avec les zéros devant
      S2:= WideChar($2681) + WideChar($2684); // => OK, on peut faire un string!
      S2 := UnicodeChar($2681 +$2684);    //  => Marche pas car fonction prtévue pour 1 seul caractère
    ...
    J'essaye d'écrire une fonction pour n'importe quelle UnicodeString, mais je n'arrive pas à mettre le caractère Nul à la fin:

    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
     
    function StrUnicode1(aTUC : array of  UnicodeChar) : UnicodeString;
     var ii : integer;
          S : UnicodeString;
    begin
      SetLength(S,High(aTUC));
      for ii := Low(aTUC) to High(aTUC) do
      begin
        S[ii]:= WideChar(aTUC[ii]);
      end;
      S[high(S)]:= WideChar(0); // ou autre, UCS4Char(0) mais ça plante à l'exécution car il ne met pas de catactère de fin;  
      result := S;
    end; 
     
    begin
        S2 := StrUnicode1([WideChar($2681),WideChar($2685),WideChar($2686),WideChar($2687),WideChar($2688)]);
        LabelCaption := S2;
    end;

  14. #14
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 939
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 939
    Par défaut
    Une UnicodeString est une WideString à la sauce Delphi. Le zéro terminal est implicite et n'a pas besoin d'être ajouté manuellement.

    Ton tableau n'est pas assez grand : SetLength(S, Length(aTUC)).
    Dans le cas de tableaux ouverts (paramètres) ou dynamiques (déclaration de variables), high() = Length() -1 et Low() vaut toujours 0.

  15. #15
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    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 173
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Et ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      S2: UnicodeString;
    begin
      S2 := #$002681 + #$002684; // OK
      S2 := WideChar($2681) + WideChar($2684); // OK
      S2 := UnicodeChar($2681) + UnicodeChar($2684); // OK
    @bb84000

    Vous paraissez bien maîtriser ce sujet auquel beaucoup (moi par exemple) ne comprennent pas grand chose. Vous ne voudriez pas faire un petit tutoriel ? Les membres de l'équipe se feraient un plaisir de vous accompagner. (Si cette idée est susceptible de vous intéresser, contacter Alcatîz ou moi-même en MP.)

  16. #16
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonsoir !

    En fait je ne maitrise rien... Je viens de reprendre tous mes tests et je m'aperçois que j'ai écrit des bêtises...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button1Click(Sender: TObject);
    var
      S2: UnicodeString;
    begin
      S2:= #$2681+#$2684;
      //S2:= #$002681+#$002684;    
      //S2:= WideChar($2681) + WideChar($2684);
      Label1.Caption:=UTF8Encode(S2) ;      // Et... sept !
    end;
    Les trois lignes affichent correctement les faces des dés, contrairement à ce que j'ai écrit plus haut.

    Par contre, même en utilisant les caractères UCS4Char, la conversion en UnicodeString ne permet pas d'afficher les caractères au dessus de U+FFFF. Seuls les 16 premiers bits sont pris en compte lors de la conversion. Par exemple U+11600 est tronqué en U+1600.

    bb84000

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

Discussions similaires

  1. afficher liste de caractères unicode
    Par marco056 dans le forum Général Python
    Réponses: 9
    Dernier message: 03/12/2015, 19h31
  2. [JDOM] caractère unicode de fin de ligne
    Par iceman dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 31/03/2009, 03h15
  3. JLabel - afficher des caractères Unicode asiatiques
    Par Nicolas_75 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 25/02/2007, 12h38
  4. Réponses: 4
    Dernier message: 14/10/2005, 09h15
  5. [CR8.5] caractères unicode
    Par Milou79 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 03/09/2004, 11h42

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