AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WideStringlist in UTF-8 mit Delphi 2007 speichern

Ein Thema von ioster · begonnen am 30. Aug 2023 · letzter Beitrag vom 31. Aug 2023
Antwort Antwort
ioster

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

AW: WideStringlist in UTF-8 mit Delphi 2007 speichern

  Alt 31. Aug 2023, 15:49
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;
DANKE!!!! Das hat geholfen, wobei ich das inhaltlich immer noch nicht verstehe. Doch ich kann das Programm nun wieder in Kombination mit dem Konverter einsetzen ohne manuell per Editor den Dateiinhalt mit einer anderen Codierung abspeichern zu müssen.

Viele Grüße
Ingo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#2

AW: WideStringlist in UTF-8 mit Delphi 2007 speichern

  Alt 31. Aug 2023, 16:22
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


https://www.compart.com/de/unicode/U+FEFF
https://de.wikipedia.org/wiki/Byte_Order_Mark

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

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
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (31. Aug 2023 um 16:40 Uhr)
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
482 Beiträge
 
#3

AW: WideStringlist in UTF-8 mit Delphi 2007 speichern

  Alt 31. Aug 2023, 16:28
Wenn umfangreicher mit UTF-8 gearbeitet wird, kannst du ab Delphi 7 mORMot verwenden. Ist der Eingang ein WideString, dann mit WideStringToUtf8 konvertieren:
Delphi-Quellcode:
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;
Ansonsten den String-Typ RawUtf8 verwenden. Mit den Funktionen StringToUtf8/Utf8ToString diesen Typ in allen Delphi Versionen konvertieren.

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#4

AW: WideStringlist in UTF-8 mit Delphi 2007 speichern

  Alt 31. Aug 2023, 16:43
Eine Delphi-Vesion weiter (2009) war Unicode/UTF-8 dann auch nativ besser nutzbar.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:08 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