Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 Uhr.
Seite 1 von 2  1 2      

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