Reconnaitre un texte UTF-8 ou ASCII

Résolu
cs_philpas Messages postés 77 Date d'inscription lundi 17 octobre 2005 Statut Membre Dernière intervention 4 septembre 2008 - 3 nov. 2005 à 15:38
doctorsf Messages postés 1 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 7 avril 2011 - 7 avril 2011 à 09:15
Bonjour,
j'ecris un programme en delphi qui lit le contenu de fichiers textes. Simple jusque là. La structure du programme ressemble à ceci

AssignFile(A,Fichier);
Reset(A);
repeat
Readln(A,Ligne);
{traitement de "Ligne"}
until Eof(A);
CloseFile(A);

Mon problème est le suivant. Mon programme doit lire des fichiers textes qui ont été enregistré soit au format ASCII (editeur MsDos) ou soit au format UTF-8 (Notepad par exemple). Ma question est la suivante: Comment savoir si le fichier que mon programme vient d'ouvrir est au format ASCII ou au format UTF-8? Y a t-il une fonction delphi qui permet de le savoir ou une autre manière de les reconnaitre?
Merci de vos réponses

7 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
3 nov. 2005 à 16:55
alors ça !

c'est la bonne question!



deja, je ne sais pas si c'est une "obligation" de ton programme
d'utiliser une vielle methode du pascal pour lire le contenus d'un
fichier.

mais elle a l'avantage d'etre rapide et de fonctionner comme un stream ... grossierement.



justement parlons en, tu as plusieurs methode pour ouvrir et lire un fichier texte.

a l'heure actuelle, nous ouvrons des fichiers video de plusieurs
centaines de mega-octets, des fichiers images monstrueux meme en jpg
(>200Ko) ...

donc un malheureux fichier texte de quelques Ko ne fait pas peur a la ressource memoire.



tu peu utiliser le TFileStream ... ou simplement un TStringList.

pour ouvrir le fichier, trés simple :



var fichier : tstringlist;

begin

fichiers := tstringlist.create;

fichiers.items.loadfromfile(filename);

end;



ensuite toute les lignes du fichiers seront contenue dans "items".

un coup d'oeuil a l'aide delphi pour plus de precision et quelques exemples.



en realtime, creation de deux fichiers a le notepad de windows, l'un an standar Ansi (ascii donc) et l'autre en UTF-8.

en ouvrant le fichier Ansi avec un editeur hexadecimal voila ce que l'on as :



blablabla

blablabla

62 6C 61 62 6C 61 62 6C 61 0D 0A 62 6C 61 62 6C 61 62 6C 61



0D0A correspond au retour a la ligne.



passont au fichier UTF-8



blablabla


blablabla

EF BB BF 62 6C 61 62 6C 61 62 6C 61 0D 0A 62 6C 61 62 6C 61 62 6C 61



tiens! une difference enorme! nous avons une signature!



il semblerais donc que les 3 premier octet correspondent a une signature de fichier texte UTF-8.



il nous faut maintenant une petite fonction qui vas bien :



function IsUTF8(filename : string) : boolean;

var

F : file of byte;

sign : array [0..2] of byte;

begin

try

AssignFile(F,FileName);

Reset(F);

Read(F,sign[0],sign[1],sign[2]);

finally

close(F);

end;

if (sign[0] = $ef) and (sign[1] = $bb) and (sign[2] = $bf) then

result := true

else

result := false;

end;



et voila, pour l'utiliser il suffit juste de faire comme cela par exemple :



procedure TForm1.Button1Click(sender : tobject);

var test : boolean;

begin

if opendialog1.execute then begin

test := IsUTF8(opendialog1.filename);

if test = true then label1.caption := 'est utf8'

else label1.caption := 'n'est pas utf8';

end;

end;



pour les fichiers unicode :



signature FFFE

chaque caractere est codé sur 16bits et non sur 8bits comme avec
l'Ascii, "a" vaux donc en hexa 6100 en unicode au lieu de 61 en ascii.

sample du fichier : FF FE 62 00 6C 00 61 00 62 00 6C 00 61 00 62 00 6C 00 61 00 0D 00 0A 00 62 00 6C 00 61 00 62 00 6C 00 61 00 62 00 6C 00 61 00





pour les fichiers unicode big endian :



signature FEFF

comme pour l'unicode, chaque caractere est codé sur 16bits, mais a
l'inverse de l'unicode, par exemple, "a" vaux 0061 au lieu de 61 en
ascii et 6100 en unicode.

sample du fichier : FE FF 00 62 00 6C 00 61 00 62 00 6C 00 61 00 62 00 6C 00 61 00 0D 00 0A 00 62 00 6C 00 61 00 62 00 6C 00 61 00 62 00 6C 00 61





cela repond t'il a ta question ?
3