Reconnaitre un texte UTF-8 ou ASCII [Résolu]

cs_philpas 77 Messages postés lundi 17 octobre 2005Date d'inscription 4 septembre 2008 Dernière intervention - 3 nov. 2005 à 15:38 - Dernière réponse : doctorsf 1 Messages postés mercredi 8 avril 2009Date d'inscription 7 avril 2011 Dernière intervention
- 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
Afficher la suite 

7 réponses

Répondre au sujet
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 3 nov. 2005 à 16:55
+3
Utile
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 ?
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de f0xi
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 3 nov. 2005 à 17:04
+2
Utile
zut ... j'ai appuyer sur tab par inadvertance.







donc modifiont definitivement notre fonction pour qu'elle reconnaisse tout les types de fichiers texte

note que un fichier non reconnus comme Unicode ou UTF8 et soit un fichier texte ascii sois un fichier de type inconnus donc

forcement Byte, d'ou le type txAnsiOrByte.



type
TxFileType = (txAnsiOrByte,txUTF8,txUNI,txUNIBIG);



implementation



function WhatTheType(filename : string) : TxFileType;
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 := txUTF8
else

if (sign[0] = $ff) and (sign[1] = $fe) then

result := txUNI

else

if (sign[0] = $fe) and (sign[1] = $ff) then

result := txUNIBIG

else

result := txAnsiOrByte;
end;
Commenter la réponse de f0xi
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 3 nov. 2005 à 22:14
0
Utile
Alors là, Foxi, moi je dis bravo.

Ca mérite même d'être publié dans la rubrique des codes sources.
<hr color="#008000">Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.croix-rouge.fr/index/partner_campagne.html
Commenter la réponse de cs_Delphiprog
cs_philpas 77 Messages postés lundi 17 octobre 2005Date d'inscription 4 septembre 2008 Dernière intervention - 4 nov. 2005 à 08:50
0
Utile
Je te remercie f0xi. Tes explications sont claires et en plus il y un exemple pour mon traitement de fichier. C'est parfait. Je vais donc, de ce pas, m'en inspirer grandement. Merci encore.


PS: En effet pour répondre à la 1ere réponse, je programmais en turbo pascal. Voilà pourquoi cette fameuse structure de programme "AssignFile(A,Fichier);
bla, bla, bla, CloseFile(A);". Je viens seulement de commencer à programmer en delphi. J'ai donc beaucoup de chose à découvrir. Je vais jeter un coup d'oeil sur les items que je ne connais pas.

Merci.
Commenter la réponse de cs_philpas
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 5 nov. 2005 à 00:00
0
Utile
@DelphiProg : oui je me le suis dis aussi mais j'ai pas eu le temps de le faire ^^



@Philpas : de rien, c'est normal, par contre c'etait sur ma reponse
qu'il falais clicker sur "reponse acceptée" et pas sur la tienne ^^



(\ /)


( , ) <-- lapin de dos
Commenter la réponse de f0xi
cs_philpas 77 Messages postés lundi 17 octobre 2005Date d'inscription 4 septembre 2008 Dernière intervention - 7 nov. 2005 à 08:44
0
Utile
Oupsss!!!! excuse moi f0xi. C'est le 1er message où je clique sur réponse acceptée. Je pensais que l'icone "réponse acceptée" validais l'ensemble des messages et non une seule réponse. Donc excuse moi encore. Je rectifie mon erreur

Merci
Commenter la réponse de cs_philpas
doctorsf 1 Messages postés mercredi 8 avril 2009Date d'inscription 7 avril 2011 Dernière intervention - 7 avril 2011 à 09:15
0
Utile
Bonjour.... et oui, 6 ans après ce post interesse toujours !!!!
Excellente démonstration !! Merci.
Par contre, savez vous comment enregistrer un fichier créé à partir d'une TStringList en UTF-8 ? Car si Notepad permets d'enregistrer au format ASCII ou UTF-8 au choix (option), il semblerait que le TstringList ne le permette pas :(

Merci de votre aide.
Commenter la réponse de doctorsf

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.