Autor Beitrag
Steph.Delphi
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Di 08.05.12 14:58 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Di 08.05.12 16:58 
Danke für die schnelle Antwort! Utf8Encode war die Lösung :)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: 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.