Einzelnen Beitrag anzeigen

Benutzerbild von mael
mael

Registriert seit: 13. Jan 2005
391 Beiträge
 
Delphi XE3 Professional
 
#4

Re: WideString in Stream speichern - Wie?

  Alt 7. Sep 2005, 13:11
SizeOf(WideChar);
würde ich anstatt der Konstanten 2 verwenden, einfach weil es klarer ist, 2 kann in einem komplexeren Algo verschiedene Gründe haben, und später fragt man sich was jetzt der genaue Grund war.

Das Windows 4-Byte große Unicode-Zeichen einführt ist mit 99%-iger Sicherheit ausgeschlossen, da es vom Speicher her totale Verschwendung bedeutet, ganz abgesehen davon, daß dies auch zu allen bisherigen Unicode-APIs inkompatibel wäre. Mit 2 Byte Zeichen kann man die Basic Multilingual Plane (BMP) direkt beschreiben wo im Prinzip alle wichtigen Zeichen drin sind, die Zeichen außerhalb der BMP setzten sich aus 2 WideChars (=4 Bytes) zusammen und bilden ein sogenanntes Surrogate-Pair.

Zu deinem Kode:
Da fehlt noch die Markierung ob es ein WideString oder ein AnsiString ist, dafür würde ich daher eine Markierung einführen. Oder mir die ganze Arbeit sparen und die von Delphi mitgelieferten Bordmittel verwenden:
TWriter bzw TReader bieten Methoden um eigentlich alle Datentypen in einen Stream zu speichern und wieder korrekt auszulesen:
z.B. TWriter.WriteString, TWriter.WriteWideString
TReader.ReadString, TReader.ReadWideString
Der Vorteil dabei ist, daß Unicode-strings platzsparend als UTF-8 gespeichert werden und man mit TReader.NextValue bestimmen kann welche Funktion aufzurufen ist.

Kleines Beispiel:
Delphi-Quellcode:
case Reader.NextValue of
  vaInt8, vaInt16, vaInt32:
    i := Reader.ReadInteger;
  vaExtended:
    f := Reader.ReadFloat;
  vaSingle:
    f := Reader.ReadSingle;
  vaCurrency:
    cur := Reader.ReadCurrency;
  vaDate:
    d := Reader.ReadDate;
  vaWString, vaUTF8String:
    WS := Reader.ReadWideString;
  vaString, vaLString:
    S := Reader.ReadString;
  // es gibt noch weiter ValueTypes
end;
Umgekehrt geht das Schreiben, ist also relativ einfach.
HxD, schneller Hexeditor:
http://mh-nexus.de/hxd
  Mit Zitat antworten Zitat