Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Textdatei mit Umlauten auslesen - falscher Zeichensatz? (https://www.delphipraxis.net/109139-textdatei-mit-umlauten-auslesen-falscher-zeichensatz.html)

Ares 25. Feb 2008 08:27


Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Hallo!

Ich arbeite gerade an einem Programm, das Einträge aus einer Protokolldatei eines anderen Programms ausließt und darstellt. Die Protokolldatei ist eine einfache Textdatei, allerdings werden Umlaute dort codiert dargestellt. Statt "Müller" steht dort also z.B. "Müller"...

Gibt es eine Möglichkeit diese Zeichen korrekt auszulesen? Kann man also beim Öffnen/Lesen einer Textdatei irgendwie einen bestimmten Zeichensatz wählen? Wenn ja, wie finde ich heraus, welcher Zeichensatz der richtige ist?

Oder müssen diese Zeichen nach dem Lesen in die richtigen Umlaute konvertiert werden? Gibt es hierfür fertige Funktionen und muss ich mir selbst etwas basteln?

Besten Dank
Ares

RavenIV 25. Feb 2008 08:45

Re: Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Schau Dir mal die Funktion OemToChar an.
Verwendung findest Du in der Delphi-Hilfe und hier im Forum.

Muetze1 25. Feb 2008 08:59

Re: Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Die Kodierung sieht mir eher nach UTF-8 aus, da aus einem Zeichen zwei werden. OEMToChar() würde aber bei einem Char bleiben.

Xong 25. Feb 2008 09:04

Re: Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Zitat:

Zitat von Ares
Ich arbeite gerade an einem Programm, das Einträge aus einer Protokolldatei eines anderen Programms ausließt und darstellt.

Wie?

Zitat:

Zitat von Ares
Die Protokolldatei ist eine einfache Textdatei, allerdings werden Umlaute dort codiert dargestellt. Statt "Müller" steht dort also z.B. "Müller"...

Wie Muetze1 schon schreibt: Dieser Effekt tritt dann auf, wenn UTF-8-kodierte Daten als ISO-8859-1-kodierte Daten gelesen werden. Dass du die meisten Buchstaben so siehst, wie du sie kennst, ist reiner Zufall und liegt daran, dass UTF-8 die ersten paar und zerquetschten Zeichen genauso kodiert wie ISO-8859-1.

Ares 25. Feb 2008 09:38

Re: Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Hallo!

Besten Dank für eure Tipps. Gibt es eine Möglichkeit zu ermitteln, welcher Zeichensatz in einer Datei verwendet wurde? Oder muss man dafür wissen, mit welchem Zeichensatz die Datei erstellt wurde?

marabu 25. Feb 2008 10:50

Re: Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Hallo,

die Unterscheidung von UTF-8 und ANSI kannst du dir schenken, wenn du beim Einlesen jede Zeile einfach mit Utf8ToAnsi() konvertierst.

Grüße vom marabu

Ares 25. Feb 2008 11:00

Re: Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Ich lese den Inhalt der Textdatei ganz in ein TStrings-Objekt ein:

Delphi-Quellcode:
var
  textfile: TStrings;
begin
  textfile: TStringList.Create;
  textfile.LoadFromFile('C:\test.text');
  Memo1.Lines.Text := textfile.Text;
  ...
end;
Wenn ich das so mache, werden die Umlaute falsch kodiert angezeigt. Verwende ich zusätzlich Utf8ToAnsi oder UTF8Decode ist textfile hinterher leer, also textfile='';

Was mache ich hier falsch?

marabu 25. Feb 2008 11:48

Re: Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Hat die Datei ein Byte-Order-Mark?

Zeige bitte mal, wie du Utf8ToAnsi() anwendest.

Nachtrag:

Delphi-Quellcode:
type
  string4 = string[4];

function SkipBOM(s: TStream; const bom: string4): Boolean;
var
  sBom: string4;
begin
  s.Position := 0;
  SetString(sBom, PChar(@sBom[1]), s.Read(sBom[1], Length(bom)));
  Result := sBom = bom;
  if not Result then
    s.Position := 0
end;

procedure LoadFromUtf8File(s: TStrings; fn: TFileName);
var
  i: Integer;
  fs: TFileStream;
begin
  fs := TFileStream.Create(fn, fmOpenRead or fmShareDenyWrite);
  try
    SkipBOM(fs, #$EF#$BB#$BF);
    s.LoadFromStream(fs);
    for i := 0 to Pred(s.Count) do
      s[i] := Utf8ToAnsi(s[i]);
  finally
    fs.Free;
  end;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
  LoadFromUtf8File(Memo.Lines, ParamStr(1));
end;

Ares 25. Feb 2008 13:01

Re: Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Nein, die Datei hat kein BOM.

Utf8ToAnsi() verwende ich ganz einfach so:

Delphi-Quellcode:
Memo1.Lines.Text := Utf8ToAnsi(textfile.Text);

Muetze1 25. Feb 2008 13:04

Re: Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Behauptung: textfile kann danach nicht leer sein, da du den Rückgabewert einer Property als Parameter verwendest (Text) und dieser geht nur in eine Richtung. Ein Setter wird hierbei definitv nicht aufgerufen und als Var Parameter wird die Property niemals akzeptiert.

Ares 25. Feb 2008 13:24

Re: Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Ok, ich habe mich etwas unklar ausgedrückt. Ich habe vorher folgendes verwendet:

Delphi-Quellcode:
textfile.Text := Utf8ToAnsi(textfile.Text);
Danach ist textfile leer.

Ares 26. Feb 2008 08:22

Re: Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Ich bin leider noch nicht weiter gekommen. Der Einsatz von Utf8ToAnsi() und Utf8Decode führen beide dazu, dass textfile.Text nach folgender Anweisung leer ist:

Delphi-Quellcode:
textfile.Text := Utf8ToAnsi(textfile.Text);
Am Beginn von textfile.Text steht wie gesagt keine BOM. Ich habe bereits versucht diese hinzufügen, dies führt allerdings zum gleichen Ergebnis.

Wenn ich das ganze mit einer Textdatei versuche die ich selbst erstellt habe, wird der Text fehlerfrei ausgegeben. Diese Textdatei erstelle ich mit Notepad unter Vista, leider weiß ich nicht, welcher Zeichensatz dort verwendet wurde. Umlaute werden jedenfalls korrekt dargestellt.

Wie kann ich aber nun den Text der scheinbar UTF-8 kodiert ist (wegen der Umlaute) auslesen?

Besten Dank
Ares

marabu 26. Feb 2008 16:30

Re: Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Hallo Ares,

wenn die Datei wirklich UTF-8 kodiert ist, dann müsste mein Beispiel-Code aus Beitrag #8 sie korrekt verarbeiten - BOM oder nicht BOM.

Wenn du eine solche Datei zur Verfügung stellen kannst, dann wird sich alles sehr schnell aufklären.

Freundliche Grüße

Ares 27. Feb 2008 09:22

Re: Textdatei mit Umlauten auslesen - falscher Zeichensatz?
 
Zitat:

Zitat von marabu
Hallo Ares,

wenn die Datei wirklich UTF-8 kodiert ist, dann müsste mein Beispiel-Code aus Beitrag #8 sie korrekt verarbeiten - BOM oder nicht BOM.

Hey, ich habe deine Ergänzung zu Beitrag #8 ganz übersehen, sorry! Damit funktioniert es prima! Besten Dank!!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:03 Uhr.

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