Connaitre le type d'un fichier texte brut (ansi, utf8, unicode, unicode big endian, rtf)


Contenu du snippet

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.

A voir également

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.