Einzelnen Beitrag anzeigen

ioster

Registriert seit: 15. Aug 2008
84 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: WideStringlist in UTF-8 mit Delphi 2007 speichern

  Alt 31. Aug 2023, 08:44
Moin,

ich kann in dem Projekt nur auf die Möglichkeiten von Delphi 2007 zurückgreifen. Anhand von Foreneinträgen und technischen Tipps habe ich schon festgestellt, dass sich der Hersteller inzwischen einiges mehr zu dem Thema einfallen lassen hat.

Eine TStringlist habe ich bisher genutzt. Doch damit komme ich nicht weiter, wenn ich den erweiterten Zeichensatz verarbeiten möchte. Den kann ich nur mit WideStrings auslesen und ich wurde auch schon gerüffelt, als ich bei den Kollegen nachfragte, warum denn die Sonderzeichen bei der Zuweisung in die TStringlist wieder verschwinden würden. Daran merkt man, dass ich bisher mit den WideStrings in der Form nichts zu tun hatte.

Jetzt habe ich gestern versucht, die WideStringliste Zeile für Zeile mit einem Filestream abzuspeichern, habe dabei aber nichts Brauchbares erzeugen können. Wenn ich die Textdatei mit einem Editor öffne, bekomme ich Sonderzeichen aus dem südostasiatischen Raum angezeigt - vermutlich chinesisch.

Ich möchte zusätzlich auch den BOM mitgeben, weil es der Konverterhersteller sich so wünscht. Aus Codebeispielen habe ich versucht, mir eine eigene Prozedur zusammenzustellen, die so aussieht:

Delphi-Quellcode:
procedure SaveToUTF16(const Filename: string; Content: TWidestringlist);
var
  BOM : WideChar;
  Stream : TFileStream;
  Zaehler : integer;
  Zeile : WideString;
begin
  Stream := TFileStream.Create(Filename, fmCreate);
  
  try
    BOM := WideChar($FFFE);
    Stream.WriteBuffer(BOM, SizeOf(BOM));

    FOR Zaehler := 0 to Content.Count - 1 Do
      begin
        Zeile := WideString(Content[Zaehler] + sLineBreak);
        Stream.WriteBuffer(PWideChar(Zeile)^, Length(Zeile) * SizeOf(WideChar));
      end;
  finally
    Stream.Free;
end;
Ich fürchte nur, dass ich ein Problem bei der Umwandlung oder bei der Positionierung des Streams habe.

Es hat schon seinen Grund, warum ich sonst gerne auf bestehende Methoden wie SaveToFile zurückgreife.

Danke im Voraus.

Viele Grüße
Ingo
  Mit Zitat antworten Zitat