Entwickler-Ecke

Dateizugriff - Keine Umlaute => Speichern in UTF-8 ohne BOM möglich?


Steph.Delphi - Di 08.05.12 14:58
Titel: Keine Umlaute => Speichern in UTF-8 ohne BOM möglich?
Ich würde gerne eine mit Delphi erstellte Text-Datei in einem anderen Programm (JabRef) öffnen. Leider werden die Umlaute falsch dargestellt. So wird z.B. aus dem Namen Stöckle beim Import St�ckle.

Die Text-Datei in notepad++ geöffnet, "Konvertieren zu UTF-8 ohne BOM" gewählt und es funktioniert.

Daher die Frage: Wie kann ich Delphi dazu bringen direkt in einem Format zu speichern, dass dieses Problem vermeidet. Als Speicherbefahl nutze ich Stringlist.SaveToFile.
(Ja, ich habe die Suchfunktion benutzt, Lösungsansätze über CharToOemBuff funktionieren ldier nicht.)

Es wäre nett, wenn da Jemand einen TIpp hätte.


jaenicke - Di 08.05.12 15:23

Utf8Encode und Uf8ToString sind deine Freunde, wenn du die Konvertierung selbst machen willst. ;-)

Ansonsten (und das empfehle ich ;-)) kannst du ein custom TEncoding erstellen, in dem du keine Preamble zurücklieferst:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  TMyEncoding = class(TUTF8Encoding)
  public
    function GetPreamble: TBytes; override;
  end;

..

function TMyEncoding.GetPreamble: TBytes;
begin
  Result := TBytes.Create();
end;
Dieses kannst du einfach an SaveToFile übergeben, das sollte gehen, habs nicht getestet.

Und als Notlösung könntest du in einen TMemoryStream speichern und ab dem vierten Byte (nach dem BOM) in einen TFileStream kopieren.


Steph.Delphi - Di 08.05.12 16:58

Danke für die schnelle Antwort! Utf8Encode war die Lösung :)


jaenicke - Di 08.05.12 17:53

Ich habe es gerade getestet, die zweite Lösung mit dem eigenen Encoding funktioniert auch. Das hat den Vorteil, dass du einfach SaveToFile nehmen kannst, wenn du ohnehin eine TStringList benutzt.


SvenAbeln - Di 08.05.12 18:42

TStrings hat auch eine Eigenschaft WriteBOM, die angibt ob ein bom geschrieben werden soll. Dann braucht man kein eigenes Encoding ableiten und kann die bisherigen Encodings verwenden.