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

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 15 nov. 2005 à 23:33
marco62118 Messages postés 35 Date d'inscription mercredi 30 janvier 2008 Statut Membre Dernière intervention 25 juin 2015 - 21 oct. 2011 à 23:46
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

marco62118 Messages postés 35 Date d'inscription mercredi 30 janvier 2008 Statut Membre Dernière intervention 25 juin 2015
21 oct. 2011 à 23:46
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
hoby500 Messages postés 86 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 26 mai 2019
22 mars 2011 à 12:43
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;
chesnetda Messages postés 9 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 8 février 2010
8 févr. 2010 à 19:25
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
jackalunion Messages postés 128 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 14 juillet 2008
25 juin 2008 à 04:04
je comprend maintenant votre logique de programation
Utilisateur anonyme
25 juin 2006 à 08:54
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õÖÃ
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
21 nov. 2005 à 05:08
Haha!

oui en effet ... mais je justifie l'apparition de la detection des types RTF et WORD pour cette raison simple :

l'extention .DOC! qui si tu te rapel au temps de MsDOS ete largement utilisée pour les fichier textes brut et meme encore maintenant vus que microsoft c'est indellicatement approprié l'extention .NFO!
donc pour ma par, je tombe encore sur des Readme.doc (texte brut) mais egalement des Readme.doc (rtf) et Readme.doc (word!)

d'ou l'interet de savoir si le .DOC est un fichier texte brut, rtf ou word ...

et pour prevenir tout probleme de gens succeptible de me demander comment faire une fonction qui detecte les avi ou wav ou je ne sais trop quoi d'autre, je leur repond directement :

Editeur Hexadecimal, recherche sur le web ou par comparaison de plusieurs fichiers de meme type et pouf c'est magique! en gros ... investigation complete.

aprés c'est une question d'habitude et de niveau pour savoir ou et comment est codé la signature d'un fichier ... certain sont simple ... d'autre moins evidents (mais c'est rare donc pas zip ... ^^ )

ps : pour ceux qui n'ont pas compris la blague de compresseur de fichiers ... rare : .RAR donc pas .ZIP ^^
hola ... ça s'ameliore pas avec le temps mes blagues...
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
15 nov. 2005 à 23:33
Je renouvelle mes félicitations et te remercie de t'être penché sur ce problème.
Cela dit, il ne faut pas que cette fonction devienne une usine à gaz à force de vouloir détecter tout type de fichier. A l'origine, il ne s'agissait que de détecter l'encodage des caractères, pas un type de document issu d'une application particulière. Sinon, on n'en finit pas : dans quelques temps, comment détectera-t-on un document word encodé en unicode big indian, hein ?
Et puisque tu as mis le doigt dans l'engrenage, les emm...s de service ne vont pas se priver de te demander comment on fait pour reconnaitre une fichier issu de telle ou telle application ?
Mon pauvre fOxi, t'as pas fini...;o)
Rejoignez-nous