![]() |
AW: WideStringlist in UTF-8 mit Delphi 2007 speichern
Delphi-Quellcode:
procedure SaveToUTF16(const Filename: string; Content: TWideStrings);
var BOM: TBytes; Stream : TFileStream; Zeile : WideString; begin Zeile := Content.Text; Stream := TFileStream.Create(Filename, fmCreate); try BOM := TBytes.Create($FF, $FE); Stream.WriteBuffer(BOM[0], Length(BOM)); Stream.WriteBuffer(Zeile[1], Length(Zeile)*Sizeof(Zeile[1])); finally Stream.Free; end; end; |
AW: WideStringlist in UTF-8 mit Delphi 2007 speichern
Wie gesagt, Arrayzugriffe auf leere Strings/Arrays, knallen gern mal, daher
Delphi-Quellcode:
Wenn man das BOM vorher als CHAR in den String einfügt, ist es egal, da dann der String nie leer ist.
if Zeile <> '' then
Stream.WriteBuffer(Zeile[1], Length(Zeile)*Sizeof(WideChar)); // oder Stream.WriteBuffer(PWideChar(Zeile)^, Length(Zeile)*Sizeof(WideChar)); PS: die TWideStrings und TWideStringList der Unit ![]() Weiß nicht ob und wie vor Delphi XE das gemacht wurde, aber diese Unit gab es auch schon in Delphi 7, wenn ich mich nicht total irre.
Delphi-Quellcode:
procedure TWideStrings.SaveToStream(Stream: TStream; Encoding: TEncoding);
var Buffer, Preamble: TBytes; begin if Encoding = nil then Encoding := TEncoding.Unicode; // The default encoding is UTF-16 Buffer := Encoding.GetBytes(string(GetTextStr)); Preamble := Encoding.GetPreamble; if Length(Preamble) > 0 then Stream.WriteBuffer(Preamble[0], Length(Preamble)); Stream.WriteBuffer(Buffer[0], Length(Buffer)); end; |
AW: WideStringlist in UTF-8 mit Delphi 2007 speichern
Zitat:
Dein Quellcode mit der UTF8-Umwandlung habe ich nicht verstanden. Als Ergebnis kam bei mir eine ANSI-Datei heraus, deren Zeichen mit einem Leerzeichen voneinander getrennt waren. Die Lösung ist jetzt aber dank Uwe Raabe da. Der Ansatz funktioniert, wobei ich immer noch nicht durchblicke, wann mit SizeOf, Length etc. gearbeitet werden muss. Ich hatte mir etliche Beispiele angeschaut, die sich aber meistens auf neuere Delphi-Versionen bezogen und somit nicht 1:1 umzusetzen waren. Viele Grüße Ingo |
AW: WideStringlist in UTF-8 mit Delphi 2007 speichern
Zitat:
Viele Grüße Ingo |
AW: WideStringlist in UTF-8 mit Delphi 2007 speichern
der eizige Unterschied ist
* man kann das codierte BOM und anschließend den codierten Text in den Stream/Datei schreiben * man kann aber auch das uncodierte BOM in den Text einfügen und das dann zusammen codiert in den Stream/Datei schreiben #$FFFF ist ungültig/verboten (laut Unicode-Standard) #$FFFE ist ungültig/verboten, aber wird als Char für den ByteOrderMark verwendet #$FEFF ist ungültig/verboten, wegen Konflikt mit dem ByteOrderMark und der Bereich #$Fxxxxxxx ist sowieso nicht existent (somit kein Konflikt möglich) Folgendes sind BOM, welche alle dem Char #$FFFF entsprechen, jeweils in ihrer Codepage dargestellt. EF BB BF = UTF-8 FE FF = UTF-16 (sowie auch UCS2), jeweils BigEndian und LittleEndian (kleinstes oder größtes Byte der Chars zuerst) FF FE 00 00 FE FF = UTF-32, jeweils BigEndian und LittleEndian FF FE 00 00 ![]() ![]() Achtung $FF $FE ist $FEFF und nicht $FFFE Windows ist LittleEndian (nicht so wie Apple früher mal BigEndian) und in Dateien wird oft auch LittleEdnian gespeichert (also praktischer Weise sind somit Datei und RAM gleich) -> zuerst das kleinste Byte -> beim Dezimal und HEX aber die Ziffern der einzelnen Bytes wiederum BigEndian :lol: Größere mehrstellige "Zahlen" sind aber BigEndian, im Text/Quellcode -> zuerst die größte Ziffer Im HTML/CSS sind Farbwerte aber andersrum, also LittleEndian, gegen über TColor -> #RRGGBB vs. $BBGGRR :wall: |
AW: WideStringlist in UTF-8 mit Delphi 2007 speichern
Wenn umfangreicher mit UTF-8 gearbeitet wird, kannst du ab Delphi 7
![]()
Delphi-Quellcode:
Ansonsten den String-Typ RawUtf8 verwenden. Mit den Funktionen StringToUtf8/Utf8ToString diesen Typ in allen Delphi Versionen konvertieren.
type
mormot.core.data, mormot.core.unicode; var line: WideString; list: TRawUtf8List; begin list := TRawUtf8List.Create; try line := '...'; list.Add(WideStringToUtf8(line)); list.SaveToFile('test.txt'); // write all lines into a new UTF-8 file finally list.Free; end; Bis bald... Thomas |
AW: WideStringlist in UTF-8 mit Delphi 2007 speichern
Eine Delphi-Vesion weiter (2009) war Unicode/UTF-8 dann auch nativ besser nutzbar. :duck:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz