Précédent   Forum des professionnels en informatique > Autres langages > Pascal > Lazarus
Lazarus Forum d'entraide sur Lazarus, l'EDI RAD multiplateforme basé sur Free Pascal
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/01/2012, 16h11   #1
Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2006
Messages : 28
Points : 41
Points : 41
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 :
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
lepotager est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 17h56   #2
Membre du Club
 
Homme Alain Caumes
Chef de projet MOA
Inscription : juillet 2011
Messages : 26
Détails du profil
Informations personnelles :
Nom : Homme Alain Caumes
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Transports

Informations forums :
Inscription : juillet 2011
Messages : 26
Points : 56
Points : 56
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 :
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!

Citation:

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
acaumes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 20h31   #3
Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2006
Messages : 28
Points : 41
Points : 41
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...
lepotager est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 21h00   #4
Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2006
Messages : 28
Points : 41
Points : 41
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
lepotager est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 21h03   #5
Membre du Club
 
Homme Alain Caumes
Chef de projet MOA
Inscription : juillet 2011
Messages : 26
Détails du profil
Informations personnelles :
Nom : Homme Alain Caumes
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Transports

Informations forums :
Inscription : juillet 2011
Messages : 26
Points : 56
Points : 56
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
acaumes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 21h47   #6
Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2006
Messages : 28
Points : 41
Points : 41
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.
lepotager est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h14.


 
 
 
 
Partenaires

Hébergement Web