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 :

Affichage de certains caractères spéciaux : £, ~, €, etc [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre régulier
    Homme Profil pro
    retraité informaticien
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité informaticien

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 75
    Points
    75
    Par défaut Affichage de certains caractères spéciaux : £, ~, €, etc
    Bonjour à tous.

    Comment afficher correctement des caractères spéciaux

    Dans un fichier texte venant de l'extérieur j'ai, entre autres, le caractère £ qui n'est pas imprimé correctement dans un stringlist.

    A l'aide de l'éditeur hexa Ghex le vidage de ce caractère donne x'A3' donc décimal 163

    pour pouvoir l'afficher correctement dans mon stringlist j'ai dû faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ZoneFichierTexte :=StringReplace(ZoneFichierTexte, #163, '£', [rfReplaceAll, rfIgnoreCase])  // symbole £
    J'ai aussi le caractère € qui donne dans Ghex x'80' donc décimal 128, donc j'ai contourné en appelant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ZoneFichierTexte := StringReplace(ZoneFichierTexte, #128, '€', [rfReplaceAll, rfIgnoreCase]);  // symbole €
    je pense qu'il s'agit d'un mauvais contournement de problème.

    Je suppose qu'il faut appeler une fonction d'encodage, mais laquelle ?

    Merci de m'avoir lu.

    Jean-Jacques

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Yop !
    Citation Envoyé par jjnoui Voir le message
    (...) Je suppose qu'il faut appeler une fonction d'encodage, mais laquelle ?
    Peut-être AnsiToUTF8(aString); ?

    À tester...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 33
    Points : 100
    Points
    100
    Par défaut
    Salut,

    Lazarus veut du UTF-8 et ton fichier est en ANSI, il faut, où encoder ton fichier en UTF-8 où transcoder lors de l'ouverture avec la fonction AnsiToUTF8, ne pas oublier de mettre l'unité "lazutf8" en uses.

  4. #4
    Membre régulier
    Homme Profil pro
    retraité informaticien
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité informaticien

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 75
    Points
    75
    Par défaut Le fichier est un dump de base de données
    Bonjour,

    Cela fait très plaisir de ne pas se sentir seul, merci.

    En ce qui concerne la conversion d'ANSI vers UTF8 d'un champ j'avais déjà testé sans succès.

    Pour l'encodage du fichier cela ne m'est pas possible car il s'agit d'un dump d'une base de données qui est sur un PDA (Sony Clié) avec une structure assez complexe.
    Je me trouverai avec des pointeurs, des compteurs ou des flags complètement délirants dans cette base.

    En cherchant (Google fait aussi partie de mes amis) il me semble que les chaines de caractères soient codées en ASCII étendu : les valeurs comprises entre x'80' et x'FF' représentent des caractères.

    J'ai créé un petit bout de code pour tester et le voici
    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
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      FDataBase  : TFileStream;
      buffer     : array [1..10] of char;
      BytesRead  : integer;
      i          : integer;
      msg : string;
    begin
      msg := '';
      FDataBase := TFileStream.Create('/home/jj/Documents/home/dump.dat', fmOpenRead);
      BytesRead := FDataBase.Read(Buffer, 8);  // édité via Ghex, le fichier (créé sous windows) contient bien x'2480A3A5A2A75B5D'
      FDataBase.Free;
      edit1.text := buffer;             // affiche '$' + 5 rectangles avec une croix + '[]'
      edit2.text := ansitoutf8(buffer); // affiche' $?????[]'
      for i := 1 to 10 do msg := msg + format('%x ', [ord(buffer[i])]);
      showmessage(msg);     // affiche bien 24 80 A3 A5 A2 A7 5B 5D
      showmessage(buffer);  // n'affiche rien
      close;
    end;
    Existe-t'il une fonction pour encoder en UTF8 depuis de l'ASCII étendu ?

    Bonne soirée,

    Jean-Jacques

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Yep !
    Citation Envoyé par jjnoui Voir le message
    (...) En cherchant (Google fait aussi partie de mes amis) il me semble que les chaines de caractères soient codées en ASCII étendu : les valeurs comprises entre x'80' et x'FF' représentent des caractères.
    (...)
    Existe-t'il une fonction pour encoder en UTF8 depuis de l'ASCII étendu ?
    Bizarre, ton histoire...

    J'ai regardé une table ASCII étendu, les codes que tu donnes ne correspondent pas à ce que j'ai l'habitude de lire, à l'exception du premier :
    • 80 = Ç
    • A3 = ù mais avec l'accent dans l'autre sens (je ne sais pas le faire au clavier) : quelle langue utilise cela ?
    • A5 = N surmonté d'un ~ : c'est de l'espagnol ?
    • A2 = o avec l'accent inversé comme A3, et avec la même remarque.
    • A7 = °, bon, le symbole "degré".


    T'es sûr que c'est du texte que tu cherches à lire ? Ça ne serait pas bêtement du binaire (enfin, de l'hexa) ?

    Question subsidiaire : dans tes posts les accents sont corrects, dans ton bout de code y a comme un souci :
    Citation Envoyé par jjnoui Voir le message
    BytesRead := FDataBase.Read(Buffer, 8); // édité via Ghex, le fichier (créé sous windows) contient bien x'2480A3A5A2A75B5D'
    Tu n'aurais pas un problème de configuration quelque part dans ta machine (dont tu ne nous dis rien) ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Est-ce que GetBufferEncoding existe en FPC ?
    si oui je pense que le problème est là , dans ce cas , s'inspirer de ce code delphi
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour,

    Si le fichier est un dump de base de donnée, il est presque certain que les données numériques, et peut-être aussi les dates, sont en binaire.

    Dans ce cas, il n'y a pas d'autre solution que de ne décoder en UTF8 que les champs de texte, en fonction de la structure du fichier. Si c'est vraiment un dump, ça ne devrait pas être trop compliqué, à condition évidemment de connaître ou de deviner les champs de la base.

    Sinon, l'unité à utiliser est LConvEncoding. Si le fichier n'est pas en ANSI, il existe beaucoup d'autres conversions possibles. Et même une fonction GuessEncoding qui peut deviner assez bien le codage des caractères.

    Bon courage !
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  8. #8
    Membre régulier
    Homme Profil pro
    retraité informaticien
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité informaticien

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 75
    Points
    75
    Par défaut Bonsoir et merci à tous
    Je vais tenter de faire un point qui répondra à certaines questions.

    Les logiciels

    Linux 12.04 est installé seul sur une partition et je boote dessus via grub.

    les versions des paquets FreePascal et Lazarus qui sont installés :

    apt-cache show lazarus | grep "Version"
    Version: 1.0.12
    Version: 0.9.30.2-2
    apt-cache show fpc | grep "Version"
    Version: 2.6.2
    Version: 2.4.4-3.1
    apt-cache show fpc-src | grep "Version"
    Version: 2.6.2

    la définition du clavier sous ubuntu (12.04)
    informations obtenues via paramètres système -> agencement du clavier
    il s'agirait du clavier français (variante obsolète)

    le clavier utilisé sous Lazarus
    Outils -> options -> assignation des touches -> charger un schéma
    l'arrangement du clavier coché est Lazarus


    Pour Jipété :

    Le contenu du fichier d'origine :
    saisie sur le pda (Sony Clié) qui tourne sous PalmOs (version 4, je crois) de la chaîne de caractères
    $€£¥¢§[] (si ces caractères sont mal affichés dans ma réponse il s'agit des caractères :
    dollar, euro, livre, yen, cent, paragraphe, crochet ouvrant et crochet fermant.

    En examinant le dump hexa du fichier j'ai bien les valeurs déjà expliquées :
    24 pour le dollar,
    80 pour l'euro,
    A3 pour la livre,
    A5 pour le yen,
    A2 pour le cent,
    A7 pour le symbole paragraphe,
    5B pour le crochet ouvrant et
    5D pour le crocher fermant.
    Ces caractères sont correctement affichés sous Windows.

    pour la correspondance code hexa caractères ascii étendu, voir le lien ci-dessous
    http://www.theasciicode.com.ar/


    fin de l'apparté


    Pour SergioMaster :

    Est-ce que GetBufferEncoding existe en FPC ? D'après Google toutes les références à cette fonction sont liées à Delphi ou embarcadero.


    Je n'ai pas la possibilité de tester immédiatement ta proposition, cependant je pense qu'il me manque la liste des uses car je ne suis pas sûr que TEncoding soit connu en standard.


    fin de l'apparté


    Pour tintinux

    En ce qui concerne la délimitation des chaînes de caractères dans le dump pas de problème

    Voici ce que je comptais mettre en conclusion :

    "Je ne peux pas intervenir globalement sur le contenu du fichier (pas de passage par un transcodage) car les données numériques en seraient affectées en même temps que les chaines de caractères.
    Je sais isoler en lisant le fichier les chaînes de caractères que je peux transcoder avant traitement.
    Je souhaite afficher les caractères spéciaux tels que sur mon pda (et sur windows) alors je pourrais faire tourner nativement mon programme sous Linux."

    Pour LConvEncoding j'aurais besoin d'un peu plus de détails (un exemple?)

    fin de l'apparté


    Pour lever le doute quant à ma configuration, serait-il possible de tester la procédure suivante et me dire si les résultats sont différents ?

    Sur la form mettre un bouton avec gestion de l'évènement OnClick
    ajouter 2 composants Edit


    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
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      FDataBase  : TFileStream;
      buffer     : array [1..10] of char;
      BytesRead  : integer;
      i          : integer;
      msg : string;
    begin
      msg := '';
      FDataBase := TFileStream.Create('/home/jj/Documents/home/dump.dat', fmOpenRead);
      BytesRead := FDataBase.Read(Buffer, 8);  // édité via Ghex, le fichier (créé sous windows) contient bien x'2480A3A5A2A75B5D'
      FDataBase.Free;
      edit1.text := buffer;             // affiche $ suivi de 5 rectangles barrés d'une croix suivis de la paire de crochets []
      edit2.text := ansitoutf8(buffer); // affiche $?????[]
      for i := 1 to 10 do msg := msg + format('%x ', [ord(buffer[i])]);
      showmessage(msg);     // affiche bien 24 80 A3 A5 A2 A7 5B 5D
      close;
    end;

    En tout cas merci à tous.

    A vous lire,
    Jean-Jacques

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Salut salut,

    Citation Envoyé par jjnoui Voir le message
    pour la correspondance code hexa caractères ascii étendu, voir le lien ci-dessous
    http://www.theasciicode.com.ar/
    Moi j'ai regardé ici : http://ljk.imag.fr/membres/Jean-Guil.../ascii-ext.gif, et dans cette table il n'y a pas le symbole "euro" !

    Citation Envoyé par jjnoui Voir le message
    $€£¥¢§[] (si ces caractères sont mal affichés dans ma réponse il s'agit des caractères :
    dollar, euro, livre, yen, cent, paragraphe, crochet ouvrant et crochet fermant.
    Ils sont parfaitement bien affichés dans ton texte, ainsi que dans le mini-éditeur utilisé pour répondre ; ils sont un peu moches dans la citation de ma réponse, lié sans doute à l'italique.

    Citation Envoyé par jjnoui Voir le message
    En examinant le dump hexa du fichier j'ai bien les valeurs déjà expliquées :
    24 pour le dollar,
    80 pour l'euro,
    A3 pour la livre,
    A5 pour le yen,
    A2 pour le cent,
    A7 pour le symbole paragraphe,
    5B pour le crochet ouvrant et
    5D pour le crocher fermant.
    Ces caractères sont correctement affichés sous Windows.
    Bon, j'ai fait ni une ni deux, j'ai copié-collé tes 8 caractères dans un éditeur de texte de ma Debian Wheezy, ils sont bien affichés, j'enregistre le fichier comme "test.txt", clic-droit/propriétés me montre un fichier de 14 octets ! Pour 8 caractères y a qqchse qui va pas !
    Ouverture du fichier avec ghex -->
    24 pour le signe dollar
    E2 82 AC pour le signe euro
    C2 A3 pour la livre
    C2 A5 le yen
    C2 A2 le cent
    C2 A7 le paragraphe
    5B pour un crochet
    5D pour l'autre
    En résumé, des longueurs variables selon le caractère = de l'unicode.

    Par ailleurs, dans ton 1er message tu dis
    J'ai aussi le caractère € qui donne dans Ghex x'80' donc décimal 128, donc j'ai contourné en appelant
    Mais il n'y a pas de caractère "euro" dans l'ascii étendu !

    Un truc m'échappe : tu veux à tout prix transformer tes 8 octets en texte, mais es-tu sûr que c'est du texte ?

    Citation Envoyé par jjnoui Voir le message
    Pour lever le doute quant à ma configuration, serait-il possible de tester la procédure suivante et me dire si les résultats sont différents ? (...)
    FDataBase := TFileStream.Create('/home/jj/Documents/home/dump.dat', fmOpenRead);
    Impossible, nous n'avons pas ce fichier...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #10
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Voici ce que je comptais mettre en conclusion :
    "Je ne peux pas intervenir globalement sur le contenu du fichier (pas de passage par un transcodage) car les données numériques en seraient affectées en même temps que les chaines de caractères.
    Je sais isoler en lisant le fichier les chaînes de caractères que je peux transcoder avant traitement.
    Je souhaite afficher les caractères spéciaux tels que sur mon pda (et sur windows) alors je pourrais faire tourner nativement mon programme sous Linux."
    Le début est juste, mais Linux n'a rien à voir directement avec ce problème. Il supporte tous les jeux de caractère depuis plus longtemps que Windows. Simplement, il est le plus souvent configuré pour afficher en UTF8 et c'est très bien comme ça, il ne faut surtout rien changer... Quant à Lazarus, il prend ce qu'on lui donne et n'a pas de responsabilité non plus.

    Pour LConvEncoding j'aurais besoin d'un peu plus de détails (un exemple?)
    C'est vraiment très simple.


    1. Il faut ajouter LConvEncoding dans la clause use de l'implémentation.
    2. Utiliser les fonctions de cette unité

    Exemple :


    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
    implementation
     
    uses LconvEncoding ;
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
     
    var
      Texte,Encoding : string ;
     
    begin
      Texte := InputBox('test jeux de caractères', 'Entrez une chaîne :', '');
      ShowMessage ( 'La voici convertie d''ISO-8859-1 en UTF-8 : '+chr(13)+
                    ISO_8859_1ToUTF8(Texte)  );
      Encoding := GuessEncoding(Texte);
      if MessageDlg ( 'Elle pourrait être dans le jeu de caractère : '+GuessEncoding(Texte)+chr(13)+
                      'Voulez-vous essayer ?' , mtConfirmation, [mbYes,mbNo], 0) = mrYes then
        ShowMessage ( 'La voici convertie d'''+Encoding+' en UTF-8 : '+chr(13)+
                      ConvertEncoding(Texte, Encoding,'UTF8')  );
    end
    ;


    D'autres précisions :

    Il n'y a pas que les jeux de caractère ANSI et UTF8.

    ANSI est un jeu de caractère "historique", utilisé par MS-DOS, et quelque peu obsolète.

    Le plus courant sur les PC Windows qui ont moins de 15 ans c'est encore ISO-8859-1, ou plutôt ISO-8859-15 qui est identique, sauf qu'il a le symbole €.

    Sur les PDA, ça varie selon les systèmes et les modèles... Mais s'il y a un symbole € ce doit être ISO-8859-15 ou alors un jeu multi-octet plus récent.

    Pour une raison que j'ignore Lazarus ne fournit pas de fonction ISO_8859_15ToUTF8 mais ISO_8859_1ToUTF8 fait le boulot à la place. Pour moi c'est un bug, mais vraiment sans conséquence.


    ps : Pour que GuessEncoding soit pertinente, il faut lui donner suffisamment à manger !
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  11. #11
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Yop !
    Citation Envoyé par tintinux Voir le message
    (...) Sur les PDA, ça varie selon les systèmes et les modèles... Mais s'il y a un symbole € ce doit être ISO-8859-15 ou alors un jeu multi-octet plus récent. (...)
    man iso_8859-15 me montre le symbole euro avec le code A4(hex) : on est loin du "80" indiqué par l'OP.
    Et si multi-octets, il ne nous en présenterait pas juste 8...

    Y a une blague cachée dans un coin, àmha.

    Citation Envoyé par tintinux Voir le message
    (...) Pour une raison que j'ignore Lazarus ne fournit pas de fonction ISO_8859_15ToUTF8 mais ISO_8859_1ToUTF8 fait le boulot à la place. Pour moi c'est un bug, mais vraiment sans conséquence.
    Je passe la ligne suivante à ta petite procédure (j'ai rajouté la couleur après passage) :
    Une chaîne avec le symbole euro dedans, celui-ci sera-t-il converti ? :
    La voici convertie d'ISO-8859-1 en UTF-8 :
    Une chaîne avec le symbole euro € dedans, celui-ci celui-ci sera-t-il converti ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  12. #12
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    C'est pas facile d'échanger sur ce site autour des problèmes d'encodage, parce que le site est en ISO-8859-1, comme on peut le voir en regardant le source de la page HTML. Il faudrait qu'ils se décident à évoluer...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="fr">
    <head> <base href="<a href="http://www.developpez.net/forums/view-source:http://www.developpez.net/forums/" target="_blank">http://www.developpez.net/forums/</a>" />
    <!--[if IE]></base><![endif]-->
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
    Donc si tu colles des caractères UTF8 dans l'éditeur de ce site, ça donne ce qu'on voit. Est-ce ce qui est affiché ? Si oui, c'est que ton gestionnaire graphique n'est pas UTF8 : étonnant sous Linux mais possible.

    Sinon, je ne vois pas dans quel jeu l'euro serait représenté par 080... Est-ce bien sûr ? Le jeu ANSI (alias CP1252) est bien antérieur à l'invention de l'euro et ne peut pas le contenir. Et dans les autres jeux ce n'est pas ce code. Mystère.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  13. #13
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Citation Envoyé par tintinux Voir le message
    (...) Donc si tu colles des caractères UTF8 dans l'éditeur de ce site, ça donne ce qu'on voit. Est-ce ce qui est affiché ? Si oui, c'est que ton gestionnaire graphique n'est pas UTF8 : étonnant sous Linux mais possible.
    C'est à moi que tu t'adresses ou à l'OP ?
    Si c'est moi, je suis en UTF8 partout et n'ai aucun souci.

    ça donne ce qu'on voit. Euh, je ne sais pas ce que tu vois (c'est vrai que c'est un problème, ce sujet ! Il faudrait presque faire des copies d'écran).

    Mais si j'appuie sur <AltGr>e ça m'affiche le symbole de l'euro dans le mini-éditeur ici, dans mon post ensuite, mais aussi dans Leafpad, dans Writer, dans l'éditeur de code de Lazarus, dans une console terminal, dans un fichier texte édité avec mcedit, etc.
    Et une vue dans GHex d'un fichier texte généré avec ce symbole me montre E2 82 AC
    Voilà...

    Citation Envoyé par tintinux Voir le message
    (...) Sinon, je ne vois pas dans quel jeu l'euro serait représenté par 080... Est-ce bien sûr ? Le jeu ANSI (alias CP1252) est bien antérieur à l'invention de l'euro et ne peut pas le contenir. Et dans les autres jeux ce n'est pas ce code. Mystère.
    Exactement la question que je posais ce matin à 10 h 01 : attendons sa réponse...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  14. #14
    Membre régulier
    Homme Profil pro
    retraité informaticien
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité informaticien

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 75
    Points
    75
    Par défaut la suite
    Bonjour à tous
    La nuit fut longue et je ne vous réponds donc que ce matin.

    Encore une fois merci de me supporter; j'ai l'impression d'être un peu lourd quelques fois.
    Les mauvaises langues diront que cela vient de mon passé 'windowsien'.

    Après différents échanges très instructifs, j'ai tout remis à plat.

    j'ai donc, sous Windows avec un éditeur hexadécimal (winhex pour le nommer), créé un fichier qui ne contient que la fameuse chaîne de caractères que vous devez commencer à connaître par coeur

    j'ai suffixé le nom de ce fichier avec .txt

    je l'ai ouvert en mode texte avec WordPad et j'affiche bien la chaîne .... y compris l'euro en 2ième position.
    Voir image jointe.

    Je confirme aussi que dans le dump de la base il s'agit bien d'une chaîne de caractères puisque je l'ai saisie spécialement en vue du test sur mon pda.

    En fouillant un peu j'ai trouvé des sites où x'80' = euro
    http:////shop.alterlinks.com/ascii-t...etendue-fr.php
    http://www.ascii-code.com/ et
    http://www.naa.fr/support/ascii2.html
    mais sur ces sites on dit bien que chaque pays a fait sa propre cuisine avec les caractères de la partie étendue ( > x'7F').


    Je viens d'écrire ma propre routine sans passer par des tables, mais en utilisant la formule fournie par Andrey (son site : http://vk.com/jabber)

    Je cite
    Let's assume that mysterious Exntended ASCII is just Latin1. Then use mask from wikipedia:

    110y yyxx 10xx xxxx

    Since you have only 00..FF then you have: 1100 00xx 10xx xxxx.

    Conversion algorithm will be following, if char code is < 127 then just dump it as is, if it is > 127 then you do 0xC0 | ((x & 0xC0) >> 24) goes to first byte, second is ((x & 0x3F) | 0x80)
    share|improve this answer

    edited Sep 9 '10 at 17:14

    answered Sep 9 '10 at 16:35
    Andrey
    ce que j'ai traduit en Free Pascal par la fonction AsciiEtenduToUTF8.
    Je vous joins un petit programme de test
    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
     
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
     
    // fonction de conversion d'une chaîne codée en Ascii étendu (enfin une de ses versions) en UTF8
    // d'après Andrey (son site : http://vk.com/jabber)
    function AsciiEtenduToUTF8(chaine : string) : string;
    var
      i, octet : integer;
    begin
      for i := 1 to length(chaine) do begin
        octet := ord(chaine[i]);
        if octet < 128 then
          result := result + chaine[i]
        else
          if octet > 128 then
            result := result + chr($C0 or ((octet and $C0) shr 6)) + chr((octet and $3F) or $80)
          else
            result := result + chr($E2) + chr($82) + chr($AC);
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      FDataBase  : TFileStream;
      BytesRead  : integer;
      ChaineEnAsciiEtendu  : array [1..8] of char;
     
      ChaineEnUTF8 : string;
     
      DumpDeAsciiEtendu : string;
      DumpDeUTF8 : string;
      i : integer;
     
    begin
      // Lecture du fichier de test
      FDataBase := TFileStream.Create('/home/jj/Documents/home/dump.dat', fmOpenRead);
      BytesRead := FDataBase.Read(ChaineEnAsciiEtendu, 8);  // édité via Ghex, le fichier (créé sous windows, via WinHex) contient bien x'2480A3A5A2A75B5D'
      FDataBase.Free;
      // Dump de ce qui a été lu
      DumpDeAsciiEtendu := '';
      for i := 1 to length(ChaineEnAsciiEtendu) do
        DumpDeAsciiEtendu := DumpDeAsciiEtendu + format('%x', [ord(ChaineEnAsciiEtendu[i])]);
     
      // Appel de la fonction de conversion
      ChaineEnUTF8 := AsciiEtenduToUTF8(ChaineEnAsciiEtendu);
     
      // Dump du résultat de conversion
      DumpDeUTF8 := '';
      for i := 1 to length(ChaineEnUTF8) do
        DumpDeUTF8 := DumpDeUTF8 + format('%x', [ord(ChaineEnUTF8[i])]);
     
     // Affichage pour vérification
      showmessage('la chaine lue en hexa : ' + #10 + DumpDeAsciiEtendu + #10#10  +
                  'est convertie en hexa : ' + #10 +  DumpDeUTF8 + #10#10 +
                  'ce qui donne bien :' + #10 + ChaineEnUTF8);
      close;
    end;
     
     
    end.
    voir image jointe

    Youpee, je viens de trouver comment faire une capture d'écran et comment joindre cette capture au post (quand je disais que je me trouvais un peu lourd..)

    Merci pour la piste de LConvEncoding, car c'est en lisant le source que j'ai décidé d'écrire ma propre fonction, cela me semblait plus simple que de me trimbaler des tables.


    Dernière petite question : que signifie OP ?

    Pour moi le sujet original est clos, cela m'a permis de bien avancer, bien entendu je reste à l'écoute

    En vous remerciant et en vous souhaitant une excellente journée,

    Jean-Jacques
    Images attachées Images attachées   

  15. #15
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Yep !
    Citation Envoyé par jjnoui Voir le message
    (...) mais sur ces sites on dit bien que chaque pays a fait sa propre cuisine avec les caractères de la partie étendue ( > x'7F').
    Alors si les caractères varient en fonction de ceci de cela, on n'est pas rendu

    Heureusement que c'est une appli perso pour un besoin perso, tu peux donc la "tuner" en fonction de tes besoins.

    Et tu t'en es bien sorti.
    (Content de voir que sur la seconde copie d'écran, la chaîne est écrite comme je la voyais, avec 3 bytes pour l'euro, et 2 pour les autres signes "étendus".)

    Citation Envoyé par jjnoui Voir le message
    (...) Dernière petite question : que signifie OP ?
    Original Post (ou Poster, je ne sais pas trop, mais au final ça fait référence au post d'origine, et ça se rencontre souvent sur les forums techniques)

    Bon week-end aussi,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

Discussions similaires

  1. Affichage de certains caractères
    Par Olivier Regnier dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 08/05/2011, 20h25
  2. interdire certains caractères spéciaux
    Par Taga1 dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2010, 12h12
  3. Réponses: 0
    Dernier message: 08/07/2009, 16h19
  4. Réponses: 5
    Dernier message: 18/03/2009, 00h56

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