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 :

Enregistrer un fichier en utf8 [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 29
    Par défaut Enregistrer un fichier en utf8
    Bonjour,

    Comme l'indique le titre, je veux enregistrer un fichier texte en utf-8 mais celui-ci s'enregistre en ansi.

    Théoriquement je crois que Lazarus (ma version est la 0.9.30) travaile par défaut en utf8. Je suis sous windows vista.

    je recupère en fait les lignes d'un memo que je veux enregistrer sous un fichier texte.

    Voici le genre de 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
     
    procedure TForm1.ButtonCreeFichierClick(Sender: TObject);
    var memotemp : Tmemo;
     
    begin
    memotemp:=Tmemo.create(Self);
    memotemp.Lines.Add (AnsiToUtf8('TITRE'));
    memotemp.Lines.Add (AnsiToUtf8('coucou'));
    memotemp.Lines.Add (AnsiToUtf8('j ai mis un AnsiToUTF8 mais j ai aussi testé sans...'));
    if SaveDialog1.Execute then
       begin
       SaveDialog1.initialdir:=ExtractFilepath(Application.ExeName);
       SaveDialog1.title:=TXT_Savedialog1;
       // voici trois types que j'ai testé mais cela revient au même
       memotemp.Lines.SaveToFile(SaveDialog1.FileName);
       //memotemp.Lines.SaveToFile(UTF8ToSys(SaveDialog1.FileName)); // idem
       //memotemp.Lines.SaveToFile(SystoUTF8(SaveDialog1.FileName)); // idem
       end;
    memotemp.destroy;
    end;
    Je n'ai aucun soucis de génération de fichier. C'est juste que ce dernier est toujours en ansi et que pour des raisons particulieres (traitement web) il faut qu'il s'enregistre en UTF8.

    J'ai ajouté des AnsiToUtf8 lors de mes ajouts au memo au cas où cela viendrai de là, j'ai testé avec des UTF8ToSys et SystoUTF8 au cas où.

    Et... rien !

    Donc je rate un truc sûrement tout bête mais je ne vois pas quoi. Et dans mon TSaveDialog je ne vois pas d'option pour le type de codage.

    Je suis preneur de toute solution ou début de solution.

    Merci d'avance.

    Patrick

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 452
    Par défaut
    Bonjour,

    Comment vérifie tu que tu as sorti ton fichier en UTF8?

    Je viens de tester chez moi la (version sans AnsiToUTF8) et pour moi, ça marche.

    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
     
        var memotemp : Tmemo;
     
    begin
    memotemp:=Tmemo.create(Self);
    memotemp.Lines.Add ('TITRE');
    memotemp.Lines.Add ('coucou');
    memotemp.Lines.Add ('j ai mis un AnsiToUTF8 mais j ai aussi testé sans...');
    if SaveDialog1.Execute then
       begin
       SaveDialog1.initialdir:=ExtractFilepath(Application.ExeName);
       SaveDialog1.title:='TXT_Savedialog1';
       // voici trois types que j'ai testé mais cela revient au même
       memotemp.Lines.SaveToFile(SaveDialog1.FileName);
       //memotemp.Lines.SaveToFile(UTF8ToSys(SaveDialog1.FileName)); // idem
       //memotemp.Lines.SaveToFile(SystoUTF8(SaveDialog1.FileName)); // idem
       end;
    memotemp.destroy;
    end;

    Mon éditeur de texte (Pspad) me signale que le texte est bien au codage UTF8 et la vérification via un éditeur hexadécimal me le confirme bien!


    54 49 54 52 45 0D 0A 63 6F 75 63 6F 75 0D 0A 6A 20 61 69 20 6D 69 73 20 75 6E 20 41 6E 73 69 54 6F 55 54 46 38 20 6D 61 69 73 20 6A 20 61 69 20 61 75 73 73 69 20 74 65 73 74 C3 A9 20 73 61 6E 73 2E 2E 2E 0D 0A

    TITRE..coucou..j ai mis un AnsiToUTF8 mais j ai aussi testé sans.....
    NB. Tu peux voir qu'il n'y a pas de BOM sur ces fichiers. Ce n'est pas nécessaire en UTF8


    Cordialement

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 29
    Par défaut
    J'utilise principalement notepad++ pour vérifier/changer entre ANSI et UTF-8 mais je réalise que notepad++ ne fait peut-être pas la différence à partir du moment où il n'y a pas de caractères spéciaux...

    Je vais tester avec pspad car si ça se trouvez le problème vient uniquement de notepad++

    je donne le résultat au plus vite...

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 29
    Par défaut
    L'erreur venait des caractères... je m'explique :

    Contrairement à mon exemple les lignes entrées ne comportaient aucune lettre accentuée (ce sont justes des urls en réalité que j'avais transformé en blablabla pour l'exemple !!!)

    Donc notepad++ (ou pspad) voyait du texte basique donc va pour de l'ANSI

    Là je viens de mettre des accents en plus (juste pour voir) et en effet... je suis bien en UTF-8 !

    En fait rien ne permettait avec ces caractères non accentués à un lecteur de fichier quelconque de savoir s'il y avait un codage spécifique puisque un tel codage était inutile au sein du fichier !!!

    Si j'avais mis l'exemple avec les vrais données (donc pas avec la phrase où on trouve bien des accents) vous m'auriez peut-être signalé le soucis.

    Preuve qu'il faut toujours donner le code exact et non "un truc qui ressemble a ce qu'on à fait".

    Merci acaumes pour ta réponse qui m'a tout compte fait aidé à comprendre mon problème.

    Patrick

  5. #5
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 452
    Par défaut
    Bonjour,

    Donc nos commentaires se sont croisé. Tant mieux!

    En fait ce morceau de texte est noté en UTF8 parce que le mot "testé" (avec le caractère "é") s'y trouve. J'ai souligné les résultats de mon éditeur hexadécimal sur le codage UTF8 du texte.
    Sinon, il n'y aucun moyen de différentier un texte en UTF8 d'un texte en ansi (et même d'un texte en ASCII 7 bits). C'est le but du codage UTF8 : pouvoir utiliser les textes qui existent déjà sans modification. C'est vrai que cela marche mieux pour les textes sans caractères accentués...

    Je suppose que tes sources sont codées en UTF8. Si ce n'est pas le cas (en fait les sources qui existaient avant le passage de Lazarus en UTF8) sont restées en ansi ce qui peut poser des problèmes... Dans ce cas, l'utilisation du menu outils/convertir le codage de projets/paquets te sortira de l'ornière.

    Cordialement

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 29
    Par défaut
    Mes sources sont bien codées en utf8 en effet et tout est rentré dans l'ordre.

    Ou plutôt, je ne m'inquiète plus qu'un fichier texte sans accent ne soit pas perçu comme UTF8 par mes éditeurs favoris

    Comme quoi parfois la solution n'est pas tout à fait dans celle qu'on pensait et le problème pas toujours dû à ce à quoi on pensait avoir à faire.

    Merci acaumes,

    Je clos donc le sujet.

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

Discussions similaires

  1. enregistrer deux fichier dans un seul fichier
    Par Bourak dans le forum Langage
    Réponses: 9
    Dernier message: 05/11/2005, 09h48
  2. Réponses: 3
    Dernier message: 01/10/2005, 21h26
  3. [FLASH MX2004] Enregistration du fichier .swf
    Par Ladzhar dans le forum Flash
    Réponses: 1
    Dernier message: 20/09/2005, 14h40
  4. [JSP] où s'enregistrent les fichiers ?
    Par Kyti dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 18/07/2005, 15h15
  5. enregistrement des fichiers tlb
    Par bidson dans le forum XMLRAD
    Réponses: 3
    Dernier message: 26/11/2003, 15h56

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