StringList als UTF-8-Datei speichern

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

StringList als UTF-8-Datei speichern

Beitrag von harrybonn »

In Delphi mache ich es so, wenn ich eine StringList (hier: slSave) im UTF-8 Format speichern möchte:

Code: Alles auswählen

 
  if UseUnicode then begin
    slSave.saveToFile (FName, TEncoding.UTF8);
  end
 


Wie mache ich das in Lazarus / Freepascal?

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

Re: StringList als UTF-8-Datei speichern

Beitrag von theo »

Kommt drauf an was drin ist. Wenn sie schon UTF-8 Text enthält, reicht normales SaveToFile.

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: StringList als UTF-8-Datei speichern

Beitrag von harrybonn »

Und wenn nicht (z.B. weil ich noch eine alte Ansistring-Dateiversion geladen habe)?

Wenn z.B. deutsche Umlaute drin sind, reicht es nicht, dass die Datei dann automatisch im UTF8-Format gespeichert wird.

Am besten wäre ja, man könnte die Datei mit BOM speichern. Geht das in Lazarus / FreePascal?

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

Re: StringList als UTF-8-Datei speichern

Beitrag von theo »

Es hat sich einiges geändert in letzter Zeit. Ich bin nicht sicher, ob das nun von "Haus aus" geht.

Du kannst sonst meinen TCharEncStream.verwenden, damit geht ziemlich alles in dem Bereich:
http://wiki.freepascal.org/UTF8_Tools#Using_streams

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: StringList als UTF-8-Datei speichern

Beitrag von harrybonn »

So geht's auch:

Code: Alles auswählen

 
procedure SpeichereTextDatei (const Dateiname, Inhalt, Dateikodierung: string);
var
  fs: TFileStream;
  s: string;
begin
  fs := TFileStream.create (Dateiname, fmCreate);
  try
    s := ConvertEncoding (Inhalt, EncodingUTF8, DateiKodierung);
    if s <> '' then fs.write(s[1], length(s));
  finally
    fs.free;
  end;
end;
 
....
  SpeichereTextDatei(FName, slSave.text, EncodingUTF8);
(stammt aus dem Lazarus-Buch von C & L)
 
 

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

Re: StringList als UTF-8-Datei speichern

Beitrag von theo »

Ich dachte du wolltest eine BOM?
Geht aber auch mit EncodingUTF8BOM

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: StringList als UTF-8-Datei speichern

Beitrag von harrybonn »

Ja, danke, genau das war gewünscht.

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: StringList als UTF-8-Datei speichern

Beitrag von harrybonn »

Das funktioniert soweit alles.

Jedoch wenn ich eine Datei laden möchte, die einen deutschen Umlaut (z.B. in "Geschäftlich.hdb") im Namen hat, steigt Lazarus bei "TFileStream.create" aus ("Unable to open File [Dateiname mit Umlaut]).

Hier nochmal die Funktion:

Code: Alles auswählen

 
function LadeTextDatei (const Dateiname: string; out Dateikodierung: string): string;
var
  fs: TFileStream;
begin
  Dateikodierung := EncodingUTF8;
  fs := TFileStream.create (Dateiname, fmOpenRead);
  try
    SetLength (Result, fs.size);
    if Result <> '' then fs.read(Result[1], Length (Result));
    Dateikodierung := GuessEncoding (Result);
    Result := ConvertEncoding (Result, DateiKodierung, EncodingUTF8);
  finally
    fs.free;
  end;
end;
 


Wie kann man das beheben?

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: StringList als UTF-8-Datei speichern

Beitrag von wp_xyz »

Entweder du rüstest auf fpc 3.0 auf, oder du konvertierst den Dateinamen mit AnsiToUtf8 (bei einem GUI-Programm) bzw. ConsoletoUtf8 (bei einem Konsolen-Programm) nach UTF8:

Code: Alles auswählen

  fs := TFileStream.Create (AnsiToUtf8(Dateiname), fmOpenRead); 

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: StringList als UTF-8-Datei speichern

Beitrag von harrybonn »

Tja, hatte ich auch schon mit AnsiToUTF8 versucht, kommt aber wieder die Fehlermeldung, wobei das 'ä' in "Geschäftlich" kryptisch dargestellt ist.

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

Re: StringList als UTF-8-Datei speichern

Beitrag von theo »

Nicht eher umgekehrt? UTF8ToAnsi oder besser UTF8ToSys.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: StringList als UTF-8-Datei speichern

Beitrag von wp_xyz »

Nein, mein Fehler: die Betriebssystem-Funktionen sind Ansi, Lazarus ist UTF8. Da der Stream eine Betriebsfunktion aufruft, musst du von UTF8 nach ANSI konvertieren, also UTF8ToAnsi.

[EDIT] Theo war schneller...

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: StringList als UTF-8-Datei speichern

Beitrag von harrybonn »

Prima, danke so geht's (jetzt unter Windows getestet).

Gilt diese Aussage auch so für andere Betriebssysteme (Linux, MAC) oder ist hier eine Unterscheidung erforderlich?

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

Re: StringList als UTF-8-Datei speichern

Beitrag von theo »

harrybonn hat geschrieben:Prima, danke so geht's (jetzt unter Windows getestet).

Gilt diese Aussage auch so für andere Betriebssysteme (Linux, MAC) oder ist hier eine Unterscheidung erforderlich?


Nimm UTF8ToSys, das tut bei UTF8 Systemen (z.B. Linux) dann einfach nix.

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: StringList als UTF-8-Datei speichern

Beitrag von harrybonn »

Perfekt, danke!

Antworten