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

 Delphi Discussion :

Problème d'affichage de chaine


Sujet :

Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut Problème d'affichage de chaine
    Bonjour,

    j'ai une chaine qui s'affiche :

    Modèle année 2020

    dans un TStringGrid sous D7, au lieu de :

    Modèle année 2020

    (Problème de code EBCDIC, l'UTF8, ... ??)

    Que dois faire pour afficher avec la bonne police de caractère ?

    Merci

    A+
    Charly

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    C'est effectivement de l'UTF8

    UTF8Decode, UTF8String devait exister en D7 (cela était le cas en D6), je n'ai pas le nom de l'unité de l'époque en tête, peut-être déjà System inclu par défaut, fonction dépréciée maintenant
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Je pense que les composants TNT feraient le job

    https://github.com/rofl0r/TntUnicode

    http://www.axolot.com/TNT/

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Merci à Tous les 2,
    je vais déjà essayer UTF8Decode

    A+
    Charly

  5. #5
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    bonjour,

    sous D7 je dirais plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UTF8ToAnsi('Se déconnecter')
    non pas que UTF8String n'existe pas mais renvoi un WideString c" qui me semble pas utile en D7

    Cordialement,

    @+

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour Cirec,

    UTF8DEcode fonctionne bien seul problème cette fonction renvoie une chaine vide si la chaine de départ est ANSI et non UTF8.

    Je vais tester ta fonction. S'il y a le même problème, je testerai la chaine de départ pour voir si elle contient le caractère ANSI 195 pour la convertir ou non

    A+

    Charly

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Utf8ToAnsi existe au moins depuis 2007, elle existait effectivement surement sur D7 puisque c'était la version que j'utilisais à cette époque, aussi dans l'unité System, donc accessible par défaut

    Je me souviens plus en quelle année j'avais bossé avec TNT Unicode (je crois juste au moment de la reprise par TMS)
    Expérimental pour gérer Français, Anglais, Portugais (Brézil) et Hébreu ...
    je me souviens avoir plus ou moins avoir un fake pour tenter de prendre un marché
    l'application Ansi passé de Windows-1252 en Windows-1255 qui donnait l'illusion de gérer le latin et l'hébreu mais pour cela fallait changer la configuration windows et activer l'hébreu pour toute les applications ANSI


    UTF8DEcode ne devrait pas renvoyer du vide, tout ce qui est entre 32 et 127 est repris tel quel, c'est uniquement au dessus de 128 que cela applique des tables de conversions
    Il y a un problème
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Les 2 fonctions ont l'air identiques.

    Je vais retester le coup de la chaine vide

  9. #9
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Ben si ! les 2 fonctions renvoient une chaine non affichable dès qu'il y a des accents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TF_Princ.Button1Click(Sender: TObject);
    Var
      Chaine2 : AnsiString ;
    begin
      Chaine2 := 'éléphant chèvre Noël' ;
      Edit1.Text := UTF8Decode(Chaine2) ;
    //  Edit1.Text :=  UTF8ToAnsi(Chaine2) ;
    end;
    Si j'enlève les accents pas de problème

    A+
    Charly

  10. #10
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Dommage que je n'ai pas de D7 ici ...

    En fouinant un peu , j'ai trouvé ça à tester

    https://jesselau.com/decode-utf8-str...-delphipascal/

  11. #11
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    Ben si ! les 2 fonctions renvoient une chaine non affichable dès qu'il y a des accents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TF_Princ.Button1Click(Sender: TObject);
    Var
      Chaine2 : AnsiString ;
    begin
      Chaine2 := 'éléphant chèvre Noël' ;
      Edit1.Text := UTF8Decode(Chaine2) ;
    //  Edit1.Text :=  UTF8ToAnsi(Chaine2) ;
    end;
    Si j'enlève les accents pas de problème

    A+
    Charly
    c'est parce que "é" et "è" ne sont pas des valeurs valides pour une chaîne UTF8

    j'ai cette fonction qui tente de détermine si une chaîne est encodée en UTF8...en fait elle s'assure simplement qu'elle est compatible UTF8 en vérifiant que les séquences de caractères UTF8 sont dans les plages autorisées

    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
     
    function IsUTF8(const Str: string): Boolean;
    var
      c : Char;
      P, EndPtr: PChar;
    begin
      Result := False;
      P := PChar(Str);
      EndPtr := P + Length(Str);
     
      // skip leading US-ASCII part.
      while P < EndPtr do
      begin
        if Ord(P^) >= $80 then break;
        Inc(P);
      end;
     
      // If all character is US-ASCII, done.
      if P = EndPtr then
        Exit;
     
      while P < EndPtr do
      begin
        c := p^;
        case c of
          #$00..#$7F:
            inc(P);
     
          #$C2..#$DF:
            if (P+1 < EndPtr)
                and ((P+1)^ in [#$80..#$BF]) then
              Inc(P, 2)
            else
              break;
     
          #$E0:
            if (P+2 < EndPtr)
                and ((P+1)^ in [#$A0..#$BF])
                and ((P+2)^ in [#$80..#$BF]) then
              Inc(P, 3)
            else
              break;
     
          #$E1..#$EF:
            if (P+2 < EndPtr)
                and ((P+1)^ in [#$80..#$BF])
                and ((P+2)^ in [#$80..#$BF]) then
              Inc(P, 3)
            else
              break;
     
          #$F0:
            if (P+3 < EndPtr)
                and ((P+1)^ in [#$90..#$BF])
                and ((P+2)^ in [#$80..#$BF])
                and ((P+3)^ in [#$80..#$BF]) then
              Inc(P, 4)
            else
              break;
     
          #$F1..#$F3:
            if (P+3 < EndPtr)
                and ((P+1)^ in [#$80..#$BF])
                and ((P+2)^ in [#$80..#$BF])
                and ((P+3)^ in [#$80..#$BF]) then
              Inc(P, 4)
            else
              break;
     
          #$F4:
            if (P+3 < EndPtr)
                and ((P+1)^ in [#$80..#$8F])
                and ((P+2)^ in [#$80..#$BF])
                and ((P+3)^ in [#$80..#$BF]) then
              Inc(P, 4)
            else
              break;
        else
          break;
        end;
      end;
     
      if P = EndPtr then
        Result := True;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    De mon coté, j'ai bricolé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    { ======================================================================== }
    Function IsUTF8(Str : String) : Boolean ;
    Var
      i : Integer ;
    Begin
      Result := False ;
      For i := 1 To Length(Str) Do
        If (Ord(Str[i]) = 195) Then
          Begin
            Result := True ;
            Break ;
          End ;
    End ;
    { ======================================================================== }
    Sachant que les caractères accentués sont précédé du caractère 195. Mais ce n'est peut être pas assez général ?

    Je vais tester la fonction de Paul qui m'a l'air plus 'Pro'

    A+
    Charly

  13. #13
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    a priori les 2 fonctions de détection de l'UTF8 fonctionnent bien. Je conserve les 2. (celle de Paul est surement plus générale)

    Merci à tous.

    A+
    Charly

  14. #14
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    le code de Paul Toth fonctionne parfaitement

    de mon coté, après vérification :
    UTF8ToAnsi fait appel à UTF8Decode

    peu importe le choix, le résultat sera le même pour un Delphi < 2009

    Cordialement,

    @+

  15. #15
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    alors le code qui n'est pas de moi au départ utilise la définition même de UTF8 qui précise que seules certaines séquences de caractères sont valides en UTF8 puisqu'il y a des bits réservés.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  16. #16
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Vous n'aviez pas expliqué correctement le problème
    C'est que vous avez parfois de l'Ansi et parfois de l'UTF8
    Si vous n’êtes pas dans la capacité de le détecter selon la source, c'est bien dommage

    Citation Envoyé par Charly910 Voir le message
    Ben si ! les 2 fonctions renvoient une chaine non affichable dès qu'il y a des accents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TF_Princ.Button1Click(Sender: TObject);
    Var
      Chaine2 : AnsiString ;
    begin
      Chaine2 := 'éléphant chèvre Noël' ;
      Edit1.Text := UTF8Decode(Chaine2) ;
    //  Edit1.Text :=  UTF8ToAnsi(Chaine2) ;
    end;
    Si j'enlève les accents pas de problème

    A+
    Charly
    En même temps, c'est pas dans le bon sens que la fonction est utilisée
    Mauvaise utilisation, mauvais résultat


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TF_Princ.Button1Click(Sender: TObject);
    Var
      Chaine2 : AnsiString ;
    begin
      Chaine2 := 'éléphant chèvre Noël' ; // Ansi souvent Windows1252
      Edit1.Text := UTF8Encode(Chaine2) ;  // Tranformation de é, è et ë en é, è et ë
      Edit2.Text :=  UTF8Decode(Edit1.Text) ;
    end;
    un simple wrapper et le problème de vouloir décoder une source dont on ne connait pas l'encodage à l'avance, parfois Ansi, parfois UTF8
    Je vous laisse essayer ce code non testé, les nouveaux Delphi utilise le CodePage UTF8 interne pour des conversions implicites

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function TryUTF8Decode(const S: string): string;
    begin
      Result := UTF8Decode(S);
      if S = '' then
       Result := S;
    end;
    C'est bien plus simple que de parser l'UTF8 deux fois !

    Utilisation simpliste si l'on peut avoir du Ansi ou UTF8 dans une chaine sans le déterminer à l'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TF_Princ.Button1Click(Sender: TObject);
    Var
      Chaine1, Chaine2 : AnsiString ;
    begin
      Chaine1 := 'éléphant chèvre Noël' ; 
      Edit1.Text :=  TryUTF8Decode(Edit1.Text) ;
     
      Chaine2 := 'éléphant chèvre Noël' ; 
      Edit2.Text := TryUTF8Decode(Chaine2);
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  17. #17
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Vous n'aviez pas expliqué correctement le problème
    C'est que vous avez parfois de l'Ansi et parfois de l'UTF8
    Si vous n’êtes pas dans la capacité de le détecter selon la source, c'est bien dommage
    j'ai vu des tas de bdd UTF8 dans lesquelles l'UTF8 est encodé deux fois du coup on a une chaîne UTF8 "été" qui une fois décodée donne "été" qu'il faut décoder pour obtenir "été" et aussi sur des bases un peu permissives où le code ansi stocké dans un champ UTF8
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  18. #18
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,

    ma chaine provient de la lecture de données Exif dans des fichiers Jpeg. Parfois c'est en ANSI, parfois c'est en UTF8.

    A+
    Charly

  19. #19
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    @ShaileTroll :

    Ta fonction marche bien, mais ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function TryUTF8Decode(const S: string): string;
    begin
      Result := UTF8Decode(S) ;
      if Result = '' then Result := S ;
    end;


    Merci

    A+
    Charly

  20. #20
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    j'ai vu des tas ... est encodé deux fois du coup on a une chaîne UTF8 "été...
    J'ai vu aussi cela mais dans des flux XML passant par des outils intermédiaires qui font de la merde (ou que le XML d'origine avait oublié d'indiquer son charset)

    Citation Envoyé par Charly910 Voir le message
    ma chaine provient de la lecture de données Exif dans des fichiers Jpeg. Parfois c'est en ANSI, parfois c'est en UTF8.
    Ah oui, c'est donc un problème de ne pas connaitre le format



    Citation Envoyé par Charly910 Voir le message
    Ta fonction marche bien, mais ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function TryUTF8Decode(const S: string): string;
    begin
      Result := UTF8Decode(S) ;
      if Result = '' then Result := S ;
    end;
    Tout à fait !
    Je n'ai pas testé, j'ai écrit direct ici car en delphi 10 lorsque j'ai tenté mon code précédent, j'ai découvert que le débuggueur faisait le travail de conversion tout seul, même RawByteString il te sort le contenu lisible au lieu du contenu brut non interprêté !

    C'est dommage que le débuggueur ne fournisse pas l'affichage des deux car pour les novices, ces subtilités de ANSI, UTF8, UTF16 sont masqués par les avancées du langage et de l'EDI
    le débuggueur affiche "été" sur la RawByteString (affecté via un UTF8Decode)

    D7 a un côté très formateur avec son "ancienneté"

    En D10, comprendre l'UTF8 sans être piégé par les conversions implictes c'est pas mal compliqué
    D10 colle des warnings partout de transtypage implicite, le code est très moche en essayant d'avoir aucun warning

    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
    procedure TOffice365MailClassesTestingForm.Button2Click(Sender: TObject);
     
      function TryUTF8Decode(const S: RawByteString): string;
      begin
        Result := UTF8ToUnicodeString(S); //
        if Result = '' then
          Result := string(S);
      end;
     
    var
      utf16: string;
      bin16, bin8: RawByteString; // RBS rien avoir avec RBS Change pour ceux qui connaissent
      utf8: RawByteString;
      ac: AnsiChar;
      u: string;
     
    begin
      utf8 := UTF8Encode('été');
      utf16 := TryUTF8Decode(utf8);
     
      SetLength(bin16, 12);
      BinToHex(PWideChar(@utf16[1]), PAnsiChar(@bin16[1]), 6);
     
      SetLength(bin8, 10);
      BinToHex(PAnsiChar(@utf8[1]), PAnsiChar(@bin8[1]), 5);
     
      for ac in utf8 do // oui maintenant une chaine peut être parcouru via un itérateur, c'est rigolo, je n'ai jamais encore osé en PROD
        u := u + WideChar(ac);
     
      ShowMessage(string(utf8) + ' ' + string(bin8) + '   ' + utf16 + ' ' + string(bin16) + '   ' + u);
     
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [Window Title]
    Office365mail
     
    [Content]
    été C3A974C3A9   été E9007400E900   été
     
    [OK]
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/06/2012, 10h13
  2. Problème d'affichage de ma liste chainée
    Par diablo9 dans le forum C
    Réponses: 6
    Dernier message: 19/05/2012, 20h37
  3. [MySQL] problème d'affichage chaine de texte
    Par tcompagnon dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/06/2007, 19h56
  4. Problème saisie et affichage de chaine
    Par sam.fet dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 11/08/2006, 17h18
  5. [problème] affichage de chaines
    Par 123quatre dans le forum C
    Réponses: 12
    Dernier message: 07/01/2006, 20h47

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