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. #21
    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
    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

  2. #22
    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 corrigé fautes de frappe et supprimé citation inutile
    On progresse mais c'est vrai qu'on bute sur le code ! C'est pour cette raison que je cherche à écrire une fonction valable quelque soit le nombre de caractères unicode. J'ai bien une solution, mais elle ne me semble pas très "propre" au sens de la programmation. Donc avant de la donner, j'ai testé sans le caractère terminal...

    1. Je cherche toujours le caractère terminal d'un tableau ouvert qui soit accepté par les WideChar

    2. Si je reprends ma fonction précédente et que j'enlève la ligne S[high(S)]:= WideChar(0); il me génère une erreur de dépassement du tas:
    Nom : Aide5.jpg
Affichages : 161
Taille : 29,9 Ko

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

  4. #24
    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
    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.
    Il faudrait voir comment est codé UCS4StringToUnicodeString. Est-ce que les surrogates sont bien calculés ?

  5. #25
    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
    Il faudrait voir comment est codé UCS4StringToUnicodeString. Est-ce que les surrogates sont bien calculés ?
    La définition est dans ustringh.inc. Mais il n'y a aucun code, pour résumer, FPC a un "gestionnaire de chaînes Unicode" qui fait appel aux fonctions correspondantes du système d'exploitation. (voir ICI), ce qui ne nous avance pas plus que ça...

    Maintenant, j'ai pris le 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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      S1: UCS4String;
      S2, S3, S4: UnicodeString;
    begin
      SetLength(S1, 3);
      S1[0]:= UCS4Char($11600);
      S1[1]:= UCS4Char($1600);
      S1[high(S1)]:= UCS4Char(0);   //Zéro dans le dernier élément de l'array
      S2:= #$2681+#$2684;
      S3:= #$11600+#$1600;
      S4:= WideChar($11600) + WideChar($1600);
      Label1.Caption:= UTF8Encode(UCS4StringToUnicodeString(S1));
      Label2.Caption:= UTF8Encode(S2) ;
      Label3.Caption:= UTF8Encode(S3) ;
      Label4.Caption:= UTF8Encode(S4) ;
    end;
    Et voilà ce que ça donne :

    Nom : test_unicode1.jpg
Affichages : 155
Taille : 4,8 Ko

    La ligne 1 et la ligne 3 donnent la même chose, le caractère $11600 est affiché sans contenu (sans doute absent des polices de caractère), à droite le caractère $1600.
    On voit sur la ligne 4 que widechar a tronqué les 16 bits les plus hauts : le compilo n'a pas émis d'erreur, mais seulement : Warning: range check error while evaluating constants (71168 must be between 0 and 65535).

    @Jimat: Le zéro terminal sert à indiquer au processus la fin de la chaîne. Si on le retire, le processus ne sait pas que la chaîne et terminée et continue de lire/écrire les données qui suivent dans la mémoire et qui appartiennent à un autre processus du programme. En général, ça plante le programme. C'est ça, une erreur de dépassement.

    bb84000

  6. #26
    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
    Je ne connais pas d'API (sous Windows) qui fasse cette conversion.

    La formule pour calculer les surrogates si le code dépasse $FFFF est donnée ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
      s :UnicodeString;
      c :cardinal;
    begin
      c := $1F600;   // Smiley
     
      s := WideChar((c -$10000) div $400 +$D800)    // High surrogate
          +WideChar((c -$10000) mod $400 +$DC00);   // Low surrogate
     
     
      Label1.Caption := UTF8Encode(s);
    end;

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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