Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Textfile als solches erkennen (https://www.delphipraxis.net/139565-textfile-als-solches-erkennen.html)

martinf16 31. Aug 2009 21:01


Textfile als solches erkennen
 
Hallo,

ich möchte unabhängig von der Endung der Datei erkennen, ob es sich um ein Textfile erkennt. Schließlich kann ein Textfile jede Menge Endungen haben (txt, htm, php...). Gibt es dafür eine bestimmte Funktion oder kann man die ersten Bytes auslesen und daran etwas prüfen?! Und wenn ja, wie macht man das?!

Vielen Dank schon mal!

himitsu 31. Aug 2009 21:07

Re: Textfile als solches erkennen
 
Es ist nicht eindeutig erkennbar.

Du kannst höchstens versuchen nach gewissen Zeichen zu suchen,
aber dafür mußt du wissen, welche Kodierungen du zulassen willst.

bei ASCII z.B. gibt es keine Zeichen über #127

UTF-8 hat oftmals eine entsprechende BOM und alle Zeichen über #127 entsprechen gewissen Mustern

unterhalb der #32 gibt es oftmals nur die Zeichen #13, #10 (Zeilenumbruch) und #8 (Tabulator)

aber dennoch können je nach Textformat alle möglichen Zeichen drin vorkommen.

jfheins 31. Aug 2009 21:08

Re: Textfile als solches erkennen
 
Du wirst die Datei einfach mal öffnen müssen und durchsuchen ;)

Wenn viele Alphanumerischen Zeichen und #13#10 vorkommen, isses wahrscheinlich Text, wenn viele nicht-Text Zeichen vorkommen ehe binär.

Um das zu realisieren könntest du son Array machen, das jedem ASCII-Zeichen einen Wert zuordnet: z.B. 0 für neutral, 1 für ein Textzeichen und -100 für Zeichen, die garantiert nicht in Text vorkommen ;)

Achja, BOM's am Anfang sindauch ein Indikator ;)

martinf16 31. Aug 2009 21:40

Re: Textfile als solches erkennen
 
Was sind denn BOMs am Anfang?!

ASCII würde mir erst einmal reichen und die Prüfung muss auch nicht so genau sein, dass sie jedes Zeichen einzeln prüft. Es sollte nur ein ungefährer Richtwert sein. Also vielleicht eine Prüfung der ersten Zeichen? Aber wie kann die aussehen?

jfheins 31. Aug 2009 21:50

Re: Textfile als solches erkennen
 
http://de.wikipedia.org/wiki/Byte_Order_Mark ;)

Wie gesagt, ordne jedem Zeichen einen Wert zu, der angibt ob es sich wahrscheinlich um Binär oder um Text handelt. Gehe dann duch die ersten 1000 oder so Zeichen und vergleiche danach den erhaltenen Wert mit einem Grenzwert.

Luckie 31. Aug 2009 21:52

Re: Textfile als solches erkennen
 
Zur problematik und BOM:
Some files come up strange in Notepad
The Notepad file encoding problem, redux

martinf16 31. Aug 2009 22:11

Re: Textfile als solches erkennen
 
Okay, wenn ich die Links jetzt richtig interpretiere heißt das, dass die normalen Textfiles, die ich prüfen möchte eigentlich gar nicht prüfbar sind, da sie kein BOM enthalten, stimmts?

Ich habe mir mal folgende Function gebastelt:

Delphi-Quellcode:
function CheckTextfile(Datei : string): boolean;
var
  F: File;
  DateiAnfang: Array [0..100] of Byte;
  I: Integer;
begin
  try
    AssignFile(F, Datei;
    Reset(F, 1);
    Blockread(F, DateiAnfang, SizeOf(DateiAnfang));
  finally
    CloseFile(F);
  end;

  for I := 0 to 100 do
    if DateiAnfang[I] //wie kann man hier weitermachen?!

end;

Luckie 1. Sep 2009 02:17

Re: Textfile als solches erkennen
 
Zitat:

Zitat von martinf16
Okay, wenn ich die Links jetzt richtig interpretiere heißt das, dass die normalen Textfiles, die ich prüfen möchte eigentlich gar nicht prüfbar sind, da sie kein BOM enthalten, stimmts?

Fast. In den Links geht es darum, dass Textdatei nicht gleich Textdatei ist, da sie unterschiedlich kodiert sein können. Das hat nur am Rande mit der BOM zu tun.


Zitat:

Delphi-Quellcode:
if DateiAnfang[I] //wie kann man hier weitermachen?!

Gar nicht. Lies dir noch mal die Links durch. Insbesondere das:
Zitat:

Here's the file "Hello" in various encodings:

48 65 6C 6C 6F

This is the traditional ANSI encoding.
48 00 65 00 6C 00 6C 00 6F 00

This is the Unicode (little-endian) encoding with no BOM.
FF FE 48 00 65 00 6C 00 6C 00 6F 00

This is the Unicode (little-endian) encoding with BOM. The BOM (FF FE) serves two purposes: First, it tags the file as a Unicode document, and second, the order in which the two bytes appear indicate that the file is little-endian.
00 48 00 65 00 6C 00 6C 00 6F

This is the Unicode (big-endian) encoding with no BOM. Notepad does not support this encoding.
FE FF 00 48 00 65 00 6C 00 6C 00 6F

This is the Unicode (big-endian) encoding with BOM. Notice that this BOM is in the opposite order from the little-endian BOM.
EF BB BF 48 65 6C 6C 6F

This is UTF-8 encoding. The first three bytes are the UTF-8 encoding of the BOM.
2B 2F 76 38 2D 48 65 6C 6C 6F

This is UTF-7 encoding. The first five bytes are the UTF-7 encoding of the BOM. Notepad doesn't support this encoding.

EWeiss 1. Sep 2009 03:26

Re: Textfile als solches erkennen
 
Das sind auch die probleme unter Windows das viel unfug mit den Dateien getrieben wird.
Warum kann man die Extension nicht generell entfernen und nur noch die Datei anhand eines Header erkennen lassen.
Bei AVI und anderen Dateien gehts ja auch warum nicht bei Text ? (.txt).

Eine *.chm Datei kann und wird deshalb auch als ausführbare EXE (Virus, trojaner) verwendet.

gruss

himitsu 1. Sep 2009 05:56

Re: Textfile als solches erkennen
 
Zitat:

This is the traditional ANSI encoding.
48 00 65 00 6C 00 6C 00 6F 00
da stimmt aber irgendwas nicht

also 2 Byte-Zeichen und 1-Byte-Ansi


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz