CONNAITRE LE TYPE D'UN FICHIER TEXTE BRUT (ANSI, UTF8, UNICODE, UNICODE BIG ENDI

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
-
Messages postés
35
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
25 juin 2015
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/34491-connaitre-le-type-d-un-fichier-texte-brut-ansi-utf8-unicode-unicode-big-endian-rtf

Messages postés
35
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
25 juin 2015

Bonjour
Je ne suis pas un pratiquant du delphi mais cequi m'intéresse et de comprendre le principe de ctte fonction ?
J'ai aussi ce problème de connaitre le codage de mon fichier avant de pouvoir l'ouvrir et je voudrais pouvoir essayer d'adapter votre code à du Visual Prolog
Messages postés
86
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
26 mai 2019

Salut
Elle n'est pas mal votre fonction, elle m'a rendu service 3 ans après sa publication.
Seulement je vous reproche de l'avoir un peu compliquer la manière de la programmer.

Voici ma version simplifiée et un peu plus étendue :

type
TTxtFileType = (txTxtOrBin, txUTF8, txUNICODE, txUNIBIG, txRTF, txXLS, txWORD, txPDF, txEXE, txZIP);

Const
STxtFileType : array[TTxtFileType] of string
= ('TEXT', 'UTF8', 'UNICODE', 'UNIBIG','RTF', 'WORD', 'Excel', 'PDF', 'BINAIRE', 'ZIP');

//-------------------------------------------------------------------------------

function GetTypeOfTextfile(const filename : string) : TTxtFileType;
type
TTxtFileSign = record
Sign : LongWord;
Mask : LongWord;
end;

const
TxtFileSigns : array[TTxtFileType] of TTxtFileSign
= (
( Sign: $00000000; Mask: $FFFFFFFF), // txTxtOrBin
( Sign: $00BFBBEF; Mask: $00FFFFFF), // txUTF8
( Sign: $0000FEFF; Mask: $FF00FFFF), // txUNICODE
( Sign: $0000FFFE; Mask: $00FFFFFF), // txUNIBIG
( Sign: $74725C7B; Mask: $FFFFFFFF), // txRTF
( Sign: $E011CFD0; Mask: $FFFFFFFF), // txWORDDOC
( Sign: $E011CFD0; Mask: $FFFFFFFF), // txXLS
( Sign: $46445025; Mask: $FFFFFFFF), // txPDF
( Sign: $00005A4D; Mask: $0000FFFF), // txEXE
( Sign: $04034B50; Mask: $FFFFFFFF) // txZIP
);

var
Flux : TFileStream;
Sign : LongWord;
TxtFileType : TTxtFileType;
begin
result := txTxtOrBin;
try

Flux := TFileStream.Create(FileName, fmOpenRead);
try
Flux.Read(Sign, 4);
finally
Flux.Free;
end;

for TxtFileType := High(tTxtFileType) downto Low(TxtFileType) do
if (Sign and TxtFileSigns[TxtFileType].Mask) = TxtFileSigns[TxtFileType].Sign then
begin
result := TxtFileType;
break;
end;
except
// ShowMessage('pb '+ FileName)
end
end;
Messages postés
9
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
8 février 2010

Juste pour donner raison à DelphiProg (quand on met le doigt dans l'engrenage, ...), la signature WordDoc est en fait la même pour les document PPT et XLS créés avec Office XP (=version 2003 je crois). En utilisant la routine de f0xi sur un DocX (Office 2007), le "sign" est $04034B50...
Cordialement,
David
Messages postés
128
Date d'inscription
mercredi 8 janvier 2003
Statut
Membre
Dernière intervention
14 juillet 2008

je comprend maintenant votre logique de programation
Messages postés
251
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
11 mai 2021

Salut,
Je cherche à décoder (lire) une disquette de données écrite pour un OS appelé rmx.
après avoir fait un dump, j'arrive à lire quelque chose, mais la plupart des caractères sont des 'carrés' (des caractères non-reconnu donc!
Est-il possible de les lire avec cette routine, ou faut-il la modifier...
Merci pour votre aide précieuse!!
Phil.

Ci joint extrait du dump:
%»Fó'B%|çî;Ý>Ã*3Ð=gÍûLÝ?ð§mo/uåwq(ÉãÌ衹ò'Eü?å???Ïjh#Ñù|?Ò
Îõ|Cùà$LûK®COÞäg
Ïß?S??¹w4p~iàó~OõÖÃ
Afficher les 7 commentaires