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 :

Lister les caractères "étendus" d'une police en perd 1 sur 2 en passant de 32 à 64 bits [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Lister les caractères "étendus" d'une police en perd 1 sur 2 en passant de 32 à 64 bits
    Bonsoir,

    Hélas c'est encore moi avec mes migrations hasardeuses.

    Là c'est une grille que j'essaie de remplir avec les caractères d'une police : les 95 premiers ça se passe toujours très bien comme on peut le voir en 32 bits, les 95 suivants ça se passe également bien en s'appuyant sur utf8tools (site) et Laz 1.4 32 bits :
    Nom : grille_32bits.png
Affichages : 405
Taille : 44,6 Ko

    par contre le même code me rate une marche sur deux en 64 bits à partir du 129e caractère, notez les colonnes de ? :
    Nom : stringgrid_64bits.png
Affichages : 358
Taille : 18,6 Ko

    J'ai tout essayé, j'ai passé l'après-midi le nez dans les wikis UTF8 et Unicode strings sans avancer d'un centimètre.

    Une idée ?

    PS : mettre ou pas {$codepage UTF8} // https://wiki.freepascal.org/FPC_Unicode_support/fr dans la Unit1.pas ne change strictement rien au résultat.

    Le cœur du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      c := 31;
      For i := 0 To 13 do      //lignes
        For j := 0 To 15 do begin   //colonnes
          c := c + 1;
          if c <> 128 then begin
            if (c > 128) and (c < 160) then continue; // les pas bons
            fCES.UTF8Text := chr(c);
            Grille.Cells[j, i] := fCES.UTF8Text;
          end;
        end;
    fCES est un TCharEncStream fourni par utf8tools.charencstream.pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TCharEncStream = class(TUniStream)
      private
        fANSIEnc: string;
        function GetANSIEnc: string;
        procedure SetANSIEnc(const AValue: string);
      protected
        function GetUTF8Text: AnsiString; override;
        procedure SetUTF8Text(AString: AnsiString); override;
      public
        constructor Create; override;
        destructor Destroy; override;
        property ANSIEnc: string read GetANSIEnc write SetANSIEnc;
      end;

  2. #2
    Membre Expert
    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
    Billets dans le blog
    2
    Par défaut
    Salut essayes les functions suivante avec LazUTF8 dans les uses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
     { Convertit et définit une chaine de caractères vers UTF-8 en utilisant les conventions pascal }
    function setToUTF8(aString : String);
    begin
      Result := Utf8EscapeControlChars(AString);
    End;
     
     { Convertit la chaine de caractères vers sa représentation au format "Ansi" }
    function setToConsole(aString : String); : String;
    Begin
      result := UTF8ToConsole(aString); 
    End;
    A+
    • "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 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
    Salut, Jérôme,

    Citation Envoyé par BeanzMaster Voir le message
    Salut essayes les functions suivantes avec LazUTF8 dans les uses
    Le problème, c'est que les fonctions que tu cites, je ne les ai pas dans mon LazUTF8.pas…

    Une autre idée ?

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    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
    Unit MyUnit;
    uses ...;
    Interface
    ....
    Implementation
    uses ...,LazUTF8;
     { Convertit et définit une chaine de caractères vers UTF-8 en utilisant les conventions pascal }
    function setToUTF8(aString : String);
    begin
      Result := Utf8EscapeControlChars(AString);
    End;
     
     { Convertit la chaine de caractères vers sa représentation au format "Ansi" }
    function setToConsole(aString : String); : String;
    Begin
      result := UTF8ToConsole(aString); 
    End;
     
    .... 
     
    end.
    j'ai regardé ici l'unite contient bien les fonctions (Utf8EscapeControlChars,UTF8ToConsole)

  5. #5
    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
    Bonsoir,
    Citation Envoyé par anapurna Voir le message
    j'ai regardé ici l’unité contient bien les fonctions (Utf8EscapeControlChars, UTF8ToConsole)
    OK, j'ai réussi à les mettre en place comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // jérome :
    function SetToUTF8(aString: string): string;
    begin
      Result := UTF8EscapeControlChars(aString);
    end;
     
    function SetToConsole(aString: String): string;
    begin
      Result := UTF8ToConsole(aString);
    end;
    Et je les utilise ainsi (dites-moi si je me trompe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      c := 31;
      For i := 0 To 13 do      //lignes
        For j := 0 To 15 do begin   //colonnes
          c := c + 1;
          if c <> 128 then begin
            if (c > 128) and (c < 160) then continue; // les pas bons
            Grille.Cells[j, i] := SetToUTF8(chr(c));
          end;
        end;
    Je fais F9, ça part dans une boucle folle et la fiche ne s'affiche pas. Ctrl F2 pour reprendre la main, je modifie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      c := 31;
      For i := 0 To 13 do      //lignes
        For j := 0 To 15 do begin   //colonnes
          c := c + 1;
          if c <> 128 then begin
            if (c > 128) and (c < 160) then continue; // les pas bons
            Grille.Cells[j, i] := SetToConsole(chr(c));
          end;
        end;
    je fais F9, la fiche s'affiche mais la grille est remplie de carrés contenant
    C'est pas gagné, c't'affaire…

  6. #6
    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
    Salut,
    Les caractères au-delà de 127 sont codés sur 2 à 4 caractères. Il faut pê utiliser UnicodeToUTF8.
    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 !

  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
    Tiens, Yves,

    Alors toi, tu viens pas souvent mais quand tu viens, c'est du lourd !
    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
      c := 31;
      For i := 0 To 13 do      //lignes
        For j := 0 To 15 do begin   //colonnes
          c := c + 1;
          if c <> 128 then begin
            if (c > 128) and (c < 160) then continue; // les pas bons
            Grille.Cells[j, i] := UnicodeToUTF8(c); // bingo ! -- merci, Yves
    // et pour "voir" un peu les choses, un mémo comme témoin
            memo1.Lines.Add(UnicodeToUTF8(c) // le bon char, de 32 à 255
               +'  '+IntToStr(c)
               +'  '+IntToStr(UTF8Length(AnsiChar(chr(c))))   // 1
               +'  '+IntToStr(UTF8Length(UnicodeToUTF8(c)))); // 1
    // mais comme toi, Yves, je m'attendais à des valeurs > 1 et non, c'est toujours 1
          end;
        end;
    Il y a peut-être une autre blague planquée ailleurs mais comme ça ne gêne pas l'affichage, on dira que c'est

    Et pourtant, c'était loin d'être intuitif pour la bonne et simple raison que tout le web nous dit que Linux c'est UTF8, alors si la solution consiste à transformer de l'Unicode (sorti on ne sait d'où [voir le log + bas]) en UTF8, moi j'y perds mon latin.

    Le log complet du mémo (la toute première colonne est générée par le forum, les quatre suivantes c'est par mon code) :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
       32  1  1
    !  33  1  1
    "  34  1  1
    #  35  1  1
    $  36  1  1
    %  37  1  1
    &  38  1  1
    '  39  1  1
    (  40  1  1
    )  41  1  1
    *  42  1  1
    +  43  1  1
    ,  44  1  1
    -  45  1  1
    .  46  1  1
    /  47  1  1
    0  48  1  1
    1  49  1  1
    2  50  1  1
    3  51  1  1
    4  52  1  1
    5  53  1  1
    6  54  1  1
    7  55  1  1
    8  56  1  1
    9  57  1  1
    :  58  1  1
    ;  59  1  1
    <  60  1  1
    =  61  1  1
    >  62  1  1
    ?  63  1  1
    @  64  1  1
    A  65  1  1
    B  66  1  1
    C  67  1  1
    D  68  1  1
    E  69  1  1
    F  70  1  1
    G  71  1  1
    H  72  1  1
    I  73  1  1
    J  74  1  1
    K  75  1  1
    L  76  1  1
    M  77  1  1
    N  78  1  1
    O  79  1  1
    P  80  1  1
    Q  81  1  1
    R  82  1  1
    S  83  1  1
    T  84  1  1
    U  85  1  1
    V  86  1  1
    W  87  1  1
    X  88  1  1
    Y  89  1  1
    Z  90  1  1
    [  91  1  1
    \  92  1  1
    ]  93  1  1
    ^  94  1  1
    _  95  1  1
    `  96  1  1
    a  97  1  1
    b  98  1  1
    c  99  1  1
    d  100  1  1
    e  101  1  1
    f  102  1  1
    g  103  1  1
    h  104  1  1
    i  105  1  1
    j  106  1  1
    k  107  1  1
    l  108  1  1
    m  109  1  1
    n  110  1  1
    o  111  1  1
    p  112  1  1
    q  113  1  1
    r  114  1  1
    s  115  1  1
    t  116  1  1
    u  117  1  1
    v  118  1  1
    w  119  1  1
    x  120  1  1
    y  121  1  1
    z  122  1  1
    {  123  1  1
    |  124  1  1
    }  125  1  1
    ~  126  1  1
      127  1  1
    *  160  1  1
    ¡  161  1  1
    ¢  162  1  1
    £  163  1  1
    ¤  164  1  1
    ¥  165  1  1
    ¦  166  1  1
    §  167  1  1
    ¨  168  1  1
    ©  169  1  1
    ª  170  1  1
    «  171  1  1
    ¬  172  1  1
    *  173  1  1
    ®  174  1  1
    ¯  175  1  1
    °  176  1  1
    ±  177  1  1
    ²  178  1  1
    ³  179  1  1
    ´  180  1  1
    µ  181  1  1
    ¶  182  1  1
    ·  183  1  1
    ¸  184  1  1
    ¹  185  1  1
    º  186  1  1
    »  187  1  1
    ¼  188  1  1
    ½  189  1  1
    ¾  190  1  1
    ¿  191  1  1
    À  192  1  1
    Á  193  1  1
    Â  194  1  1
    Ã  195  1  1
    Ä  196  1  1
    Å  197  1  1
    Æ  198  1  1
    Ç  199  1  1
    È  200  1  1
    É  201  1  1
    Ê  202  1  1
    Ë  203  1  1
    Ì  204  1  1
    Í  205  1  1
    Î  206  1  1
    Ï  207  1  1
    Ð  208  1  1
    Ñ  209  1  1
    Ò  210  1  1
    Ó  211  1  1
    Ô  212  1  1
    Õ  213  1  1
    Ö  214  1  1
    ×  215  1  1
    Ø  216  1  1
    Ù  217  1  1
    Ú  218  1  1
    Û  219  1  1
    Ü  220  1  1
    Ý  221  1  1
    Þ  222  1  1
    ß  223  1  1
    à  224  1  1
    á  225  1  1
    â  226  1  1
    ã  227  1  1
    ä  228  1  1
    å  229  1  1
    æ  230  1  1
    ç  231  1  1
    è  232  1  1
    é  233  1  1
    ê  234  1  1
    ë  235  1  1
    ì  236  1  1
    í  237  1  1
    î  238  1  1
    ï  239  1  1
    ð  240  1  1
    ñ  241  1  1
    ò  242  1  1
    ó  243  1  1
    ô  244  1  1
    õ  245  1  1
    ö  246  1  1
    ÷  247  1  1
    ø  248  1  1
    ù  249  1  1
    ú  250  1  1
    û  251  1  1
    ü  252  1  1
    ý  253  1  1
    þ  254  1  1
    ÿ  255  1  1
    Merci à tous et Yves, ,

  8. #8
    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
    Salut JP !

    Si tu utilises UTF8Length, il donne le nombre de caractères codés (1, ici) ; si tu utilises Length sur une chaîne codée en UTF8, il donne le nombre d'octets utilisés pour les coder (entre 1 et 4 par caractère).

    Bon week-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 !

  9. #9
    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
    Bonjour, Yves,

    Citation Envoyé par tourlourou Voir le message
    Si tu utilises UTF8Length, il donne le nombre de caractères codés (1, ici) ; si tu utilises Length sur une chaîne codée en UTF8, il donne le nombre d'octets utilisés pour les coder (entre 1 et 4 par caractère).
    comme on dit, il vaut mieux 1 qui sait que 10 qui cherchent,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    memo1.Lines.Add( UnicodeToUTF8(c) // le bon char, de 32 à 127 puis 160 à 255
      +'  '+IntToStr(c)
      +'  '+IntToStr(Length(UnicodeToUTF8(c))   // 1 puis 2 à partir de 129 (glyphes non affichables jusqu'à 159)
      +'  '+IntToStr(UTF8Length(UnicodeToUTF8(c))) ); // toujours 1
    Citation Envoyé par tourlourou Voir le message
    Bon week-end !
    U 2, et encore merci,

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

Discussions similaires

  1. Lister les fichiers d'un répertoire dans une feuille Excel
    Par AlainTech dans le forum Contribuez
    Réponses: 7
    Dernier message: 15/02/2025, 17h06
  2. [MySQL] encodage sur les caractères : quote, tirets
    Par tigunn dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/01/2014, 14h32
  3. Réponses: 2
    Dernier message: 30/12/2010, 17h02
  4. Lister les caractères d'une chaîne
    Par CyrilleB dans le forum Langage
    Réponses: 4
    Dernier message: 03/08/2010, 16h15
  5. |VB6] Comment Lister les liens vers des fichiers d'une page web
    Par Mayti4 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 18/01/2005, 18h17

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