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

  1. #1
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    383
    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 : 383
    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
    184
    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 : 184
    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
    383
    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 : 383
    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
    184
    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 : 184
    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
    6 003
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 6 003
    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 216
    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 216
    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
    184
    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 : 184
    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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 6 003
    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;

  9. #9
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    383
    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 : 383
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    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;
    Merci à tous,

    Y'a pas de problème Andnotor, c'est toujours utile à la communauté d'apporter des reflexions.
    J'ai essayé, mais il n'accepte pas la directive de Delphi {$mode delphi}; est-ce incompatible avec {$mode objfpc}{$H+}
    Si je retire la directive et laisse celle de Unicode,ça ne marche toujours pas.

    Dans les unités de départ je n'ai rien de spécial,
    le type UCS4String = array of UCS4Char; est défini dans systemh.inc

  10. #10
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    184
    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 : 184
    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

  11. #11
    Rédacteur/Modérateur

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

    Non, chez moi, ça donne toujours deux points d'interrogations.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {.$mode objfpc}{.$H+}
    {$mode delphi}
    {$modeswitch unicodestrings}
    @bb84000

    Maintenant j'ai deux avertissements au lieu d'un.

    unit1.pas(47,8) Warning: Implicit string type conversion from "RawByteString" to "UnicodeString"
    unit1.pas(48,22) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "TTranslateString"
    Les lignes en questions étant les suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      S := UTF8Encode(UCS4StringToUnicodeString(S1));
      Label1.Caption := S;

  12. #12
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    184
    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 : 184
    Par défaut
    Bonjour !

    Citation Envoyé par Roland Chastain Voir le message
    Maintenant j'ai deux avertissements au lieu d'un.
    Pas d'avertissement si on utilise uniquement {$mode objfpc}{$H+}.

    bb84000

  13. #13
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    383
    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 : 383
    Par défaut
    Citation Envoyé par bb84000 Voir le message

    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));
    Merci bb84000 pour cette précision

    j'en profite pour poser une question annexe:

    S1 : UCS4String;
    Mais S1[1] est de type UCS4Char défini dans systemh.inc => UCS4Char = type 0..$10ffff; ($2681);
    J'ai voulu afficher S1[1] seul dans un showmessage, mais ça plante à la compilation me disant que UCS4Char n'est pas compatible avec PUnicodeChar. Je ne dois pas utiliser la bonne fonction trouvée dans ustringh.inc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     showmessage(UnicodeCharToString(S1[1])); // Erreur Compilation
     showmessage(UCS4StringToUnicodeString(S1); // Fonctionne mais affiche toute la chaine, j'aurai voulu un seul caractère

  14. #14
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 216
    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 216
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par bb84000 Voir le message
    Pas d'avertissement si on utilise uniquement {$mode objfpc}{$H+}.
    Ah oui, au temps pour moi.

    Les deux avertissements n'apparaissent qu'avec la directive {$modeswitch unicodestrings}.

  15. #15
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    184
    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 : 184
    Par défaut
    Bonjour,

    Citation Envoyé par Jlmat Voir le message
    S1 : UCS4String;
    Mais S1[1] est de type UCS4Char défini dans systemh.inc => UCS4Char = type 0..$10ffff; ($2681);
    J'ai voulu afficher S1[1] seul dans un showmessage, mais ça plante à la compilation me disant que UCS4Char n'est pas compatible avec PUnicodeChar. Je ne dois pas utiliser la bonne fonction trouvée dans ustringh.inc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     showmessage(UnicodeCharToString(S1[1])); // Erreur Compilation
     showmessage(UCS4StringToUnicodeString(S1); // Fonctionne mais affiche toute la chaine, j'aurai voulu un seul caractère
    S1[1] est un caractère. []IUCS4StringToUnicodeString[/I] attend une chaîne de caractères à zéro terminal. Donc le compilateur proteste.

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      SetLength(S1, 2);           // Chaîne de longueur 2 (y compris le zéro terminal)
      S1[0]:= UCS4Char($2684);    // Le caractère unique qu'on veut afficher en position zéro
      S1[high(S1)]:= UCS4Char(0); // Le zéro terminal (High(S1) pour être certain de ne pas dépasser la longueur de l'array)
      S:= UTF8Encode(UCS4StringToUnicodeString(S1));  // On transforme en Unicode, puis UTF8
      Label1.Caption:= S;
    bb84000

  16. #16
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    383
    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 : 383
    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...

  17. #17
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    184
    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 : 184
    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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 6 003
    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()

  19. #19
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    383
    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 : 383
    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;

  20. #20
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 216
    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 216
    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.)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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