Suite a un probleme d'un membres de Delphi.fr qui ne savais pas comment connaitre le type d'un fichier texte brut,
je me suis donc affairé sur cette fonction simple d'un niveau debutant.
elle permet de reconnaitre les fichiers texte (.txt) au format Ansi (ascii), UTF8, Unicode et Unicode big endian, RTF et egalement Word Document (peut ne pas fonctionner avec tout les fichiers .Doc).
Source / Exemple :
type
TTxtFileType = (txTxtOrBin,
txUTF8,
txUNICODE,
txUNIBIG,
txRTF,
txWORDDOC
);
TTxtFileSign = record
Code : TTxtFileType;
Sign : LongWord;
Mask : LongWord;
end;
const
TxtSignsCount = 5;
TxtSign_UTF8 : TTxtFileSign = (Code: txUTF8; Sign:$00BFBBEF; Mask: $00FFFFFF);
TxtSign_UNICODE : TTxtFileSign = (Code: txUNICODE; Sign:$0000FEFF; Mask: $FF00FFFF);
TxtSign_UNIBIG : TTxtFileSign = (Code: txUNIBIG; Sign:$0000FFFE; Mask: $00FFFFFF);
TxtSign_RTF : TTxtFileSign = (Code: txRTF; Sign:$74725C7B; Mask: $FFFFFFFF);
TxtSign_WORDDOC : TTxtFileSign = (Code: txWORDDOC; Sign:$E011CFD0; Mask: $FFFFFFFF);
var
TxtFileSigns : array[0..TxtSignsCount-1] of TTxtFileSign = (
TxtSign_UTF8,
TxtSign_UNICODE,
TxtSign_UNIBIG,
TxtSign_RTF,
TxtSign_WORDDOC
);
function TypeOfTextfile(const filename : string) : TTxtFileType;
var
Flux : TFileStream;
Sign : LongWord;
N : integer;
begin
Flux := TFileStream.Create(FileName, fmOpenRead);
try
Flux.Read(Sign, 4);
finally
Flux.Free;
end;
result := txTxtOrBin;
for N := 0 to High(TxtFileSigns) do
begin
if (Sign and TxtFileSigns[N].Mask) = TxtFileSigns[N].Sign then
begin
result := TxtFileSigns[N].Code;
break;
end;
end;
end;
Conclusion :
Woila, vus la simplicitée de la fonction on pourrait meme ajouter d'autre type de documents
qu'ils soit texte brut ou texte formater (RTF, DOC, PDF ect...).
Notez bien que certain format comme le unicode ont une signature de seulement 2 octets et pas 3 comme les autres.
Il ya egalement un interet a savoir si le fichier est Unicode ou Unicode Big Endian car en unicode les caracteres
ne sont pas codé sur 8bits (Ansi / UTF8) mais sur 16bits.
par exemple, la lettre "a" a pour valeur ordinale x61 en Ansi et UTF8,
sa valeur en Unicode est x6100
et en Unicode Big Endian c'est x0061
et il en est de meme pour tout les caracteres icompris le code de retour chariot (x0D0A) :
Ansi/UTF8 = x0D0A
Unicode = x0D000A00
Unicode BE= x000D000A
Ce qui prouve bien qu'il peut etre utile de connaitre le format d'encodage d'un fichier texte meme brut.
ps : comme a l'habitude, pas de zip avec ce code si court.
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.