Wie kann man UTF-16 (aka Windows) Textdateien lesen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7195
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von af0815 »

Ich möchte Textdateien unter Linux einlesen die UTF-16 kodiert sind. Sie haben einen BOM 'ff' 'fe' und beinhalten sowohl 'normale' als auch griechische Buchstaben.

Folgendes geht nicht:

Code: Alles auswählen

var
  f : TextFile;
  wstr : WideString;
  str : string;
begin
  str := '../texte/voktest.txt';
  {$i-}
  System.Assign (f,str);
  System.Reset (f);
  {$I+}
  while not EOF(f) do
  begin
    System.ReadLn(f,wstr);
    Memo1.Lines.Add(UTF8Encode(wstr));
  end;
  System.Close (f);
da der compiler folgendes bemängelt

Code: Alles auswählen

.... Fatal: unknown compilerproc "fpc_read_text_widestr". Check if you use the correct run time ...
Kann ich überhaupt UTF-16 direkt lesen ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 11227
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von theo »

Ich hab sowas gemacht, ist aber noch nicht gut getestet (kannst du ja machen ;-) und basiert auf TStream.
Siehe Anhang.

Benutzen so:

Stream muss ein TMemoryStream oder TFileStream sein.

with TUniLoader.Create(Stream) do
begin
Memo1.Text:=GetFullString;
free;
end;
Dateianhänge
wopruniloader.pas
Neue Version 5.2.09
(5.28 KiB) 113-mal heruntergeladen
Zuletzt geändert von theo am Do 5. Feb 2009, 23:53, insgesamt 3-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7195
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von af0815 »

theo hat geschrieben:Ich hab sowas gemacht, ist aber noch nicht gut getestet (kannst du ja machen ;-) und basiert auf TStream.
Danke bin beim Testen. Der Output ist noch nicht so wie ich will, jetzt muß ich mir das aber noch genauer ansehen.

Prinzipiell läuft es, deutsch wird dargestellt, nur das griechische noch nicht, das kann aber mit dem System zusammenhängen. Wird noch recht interessant.

DANKE
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 11227
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von theo »

Das Memo muss nat. auf einen Font eingestellt sein, welcher griechisch kann.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7195
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von af0815 »

theo hat geschrieben:Das Memo muss nat. auf einen Font eingestellt sein, welcher griechisch kann.
Ist nicht mein Problem, ich musste auf gtk2 umstellen, da es mit gtk1 nicht so wirklich geht. Jetzt sehe ich es aber richtig, daher wird sowohl deutsch als auch griechisch im Memo angezeigt. Die Unit von dir geht gut und ohne Probleme bisher.

Nochmals danke, jetzt kann ich ein wenig weiter. Mal sehen was das ganze für jetzt noch für Überraschungen bereit hält.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 11227
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von theo »

af0815 hat geschrieben: Ist nicht mein Problem, ich musste auf gtk2 umstellen, da es mit gtk1 nicht so wirklich geht.
Achso ja, GTK1 und Unicode funzt nicht so richtig.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7195
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von af0815 »

af0815 hat geschrieben:Nochmals danke, jetzt kann ich ein wenig weiter. Mal sehen was das ganze für jetzt noch für Überraschungen bereit hält.
Das iterieren durch die Zeichen ist gar nicht so easy. Es scheint nur so, das es bei UTF-8 leichter ist als bei den anderen Zeichenkodierungen.

inwieweit bist du an Änderungen interessiert ? Ich werde da einiges dazu benötigen, weil ich die Textdateien in Textteile bzw. Zeichen zerlegen muß. Bzw. auch in die andere Richtung arbeiten werde (utf-8 nach widestring).

Es wird ein Programm damit ich mir beim Verben beugen in Griechisch leichter tue. Momentan habe ich listen mit den Beugungen und den Vokabeltrainer (Windows). Ich möchte den Austausch zwischen den Listen und den Trainer erleichtern.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 11227
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von theo »

Ich hab einiges mit UTF-8 für WOPR gemacht. Kannst mich fragen, wenn du Probleme hast.
Vielleicht findest du auch den utf8helper ganz lustig, den ich hier mal gepostet habe:
http://www.lazarusforum.de/viewtopic.php?p=24321#p24321" onclick="window.open(this.href);return false;
Damit kann man u.a. relativ schnell UTF-8 Strings scannen oder die "Buchstaben" als UCS-4 etc. zugreifen.
Hier dazu noch die aktuellere Demo: http://www.lazarusforum.de/viewtopic.php?p=24358#p24358" onclick="window.open(this.href);return false;
Eine Unicode Datenbank hätte ich auch im Kasten. Diese würde ich im Moment per PM weitergeben.

EDIT: Was soll's. Die Lib können eigentlich alle haben. http://www.theo.ch/lazarus/utf8proc_pas.zip" onclick="window.open(this.href);return false;
Das ist das Resultat dieser Bemühungen hier: http://www.lazarusforum.de/viewtopic.ph ... &sk=t&sd=a" onclick="window.open(this.href);return false;
Bitte die Lizenz des Originals und der unicode.org respektieren.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7195
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von af0815 »

Dank an Theo, mittlerweile kann ich recht gut meine Dateien von ansi oder sonstwas nach utf8 konvertieren. Vor allen bleibt das griechisch, griechisch :-)

Wenn du nichts dagegen hast, lege ich die Werke in den svn von den lazsnippets. Dorthin kommt auch das Programm zum Umwandeln, nur ohne deine Kernkompenenten wäre es nicht lebensfähig und somit hinfällig.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 11227
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von theo »

af0815 hat geschrieben: Wenn du nichts dagegen hast, lege ich die Werke in den svn von den lazsnippets..
Welche Teile von meinem Zeug hast du denn verwenden können?
Die utfproc_pas würde ich gerne auf http://www.theo.ch" onclick="window.open(this.href);return false; als zentrale Downloadstelle belassen.
Mit dem Rest kannst du v.m.a machen was du möchtest.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7195
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von af0815 »

theo hat geschrieben:Welche Teile von meinem Zeug hast du denn verwenden können?
Ich habe das was ich derzeit besonders benötige in wopruniloader.pas gefunden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7195
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von af0815 »

Theo, danke nochmals. Ich bin dank deiner unit jetzt in der Lage meine Vokabeln vom Excel/OpenofficeCalc Sheet in den Vokabeltrainer zu bekommen. Ausserdem klärt sich für mich die babylonische Verwirrung um UTF-8, ANSI, ... und andere Speicherformate.

Das Konstrukt liest fast alles ein.

Code: Alles auswählen

uses wopruniloader;
 
{ TForm1 }
 
procedure TForm1.actStartExecute(Sender: TObject);
var aFilename : string;
    aStringList1,
    aStringList2 : TStringList;
    i,j : integer;
    aString : string;
    //
    aStream : TFileStream;
    str : string;
    aUniloader: TUniLoader;
begin
  aFilename := './alles.csv';
  // Objekte erzeugen
  aStringList1 := TStringList.Create;
  aStringList2 := TStringList.Create;
  // Datei in Stream einlesen
  aStream := TFileStream.Create(aFilename,fmOpenRead);
  // Streamzeiger sicherheitshalber an den Anfang setzen
  aStream.Seek(0,soBeginning);
  // Konvertieren
  aUniLoader := TUniLoader.Create(aStream);
  Label1.Caption := aUniloader.FileTypeStr;
  aStringList1.Text:= aUniLoader.GetFullString;
  Memo1.Text:= aUniLoader.GetFullString;
  // In stringlist1 ist jetzt das ganze File
 
  StringGrid1.ColCount := 9;
  StringGrid1.RowCount := aStringList1.Count + 1;
 
  for j:= 0 to aStringList1.Count -1 do
  begin
    aStringList2.QuoteChar:= '"';
    aStringlist2.Delimiter:= ';';
    aStringList2.DelimitedText:= aStringList1.Strings[j];
    // falls die länge nicht stimmt, weitermachen
    if aStringList2.Count <> 8 then continue;
    //ins Grid bringen
    for i := 0 to aStringList2.Count - 1 do
    begin
      aString := aStringList2.Strings[i];
      StringGrid1.Cells[i+1,j+1] := aString;
    end;
  end;
  aStringList1.free;
  aStringList2.free;
  aUniLoader.free;
  aStream.free;
end;
Das Zerlegen der Zeile mit dem richtigen Properties von der TStringList ist ja nur noch die Pflicht.

Es waren übrigends 2975 griechische Vokabeln (Verben in allen möglichen Formen) die ich jetzt in ein paar Sekunden importieren kann. Jetzt fehlt noch, das ich die auch noch lernen muß .... aber das ist eine andere Geschichte.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 11227
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von theo »

af0815 hat geschrieben:Theo, danke nochmals.
Gerne.
Habe übrigens oben http://www.lazarusforum.de/viewtopic.php?p=25850#p25850" onclick="window.open(this.href);return false;
die Sache noch um eine Idiotenvariante ;-) erweitert.

Memo1.Text:=LoadUTF8FromFile('meins.txt');

Es ist aber nicht nur idiotischer, sondern bezieht auch noch die LConvencoding ein.
Meine Klasse ist ja dazu da, die BOM zu handeln. Gibt es kein BOM, kann sie auch nicht zwischen ANSI und UTF-8 unterscheiden.

Die Fkt. LoadUTF8FromFile kann auch das, soweit möglich. Mehr kann man ohne heuristische oder dictionary Verfahren nicht herausfinden.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7195
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von af0815 »

Ich hab noch folgendes eingefügt - zur Visualisierung :-)

Code: Alles auswählen

function TUniLoader.GetFileTypeStr: string;
begin
  if not fHaveType then CheckFileType;
  case fUniFileType of
    ufUndefined: Result := 'Undefined';
    ufUtf8:      Result := 'Utf8';
    ufUtf16be:   Result := 'Utf16be';
    ufUtf16le:   Result := 'Utf16le';
    ufUtf32be:   Result := 'Utf32be';
    ufUtf32le:   Result := 'Utf32le';
  end;
end;
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 11227
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie kann man UTF-16 (aka Windows) Textdateien lesen

Beitrag von theo »

Schön, so kommt man doch weiter. :wink:

Habe es eingebaut und in der LoadUTF8FromFile noch um die Rückgabewerte der LConvEncoding erweitert.
http://www.lazarusforum.de/viewtopic.php?p=25850#p25850" onclick="window.open(this.href);return false;

Eigentlich müsste diese Unit fast in die LCL, damit da nicht jeder das Rad neu erfinden muss.

Antworten