![]() |
Unicodestring in stream speichern
Hi,
ich habe mir einige der Diskussionen über das Speichern von String (Unicode) durchgelesen und selbst experimentiert
Delphi-Quellcode:
das funktioniert sogar!
var astring:unicodestring;
s:tstream; i:integer; speichern i:=length(astring); s.write(i,sizeof(i)); s.write(pointer(astring)^,i); lesen s.Read(i,sizeof(i)); SetLength(astring,i); s.Read(pointer(f_string)^,i); wiederspricht folgendem Fakt: "Bei Unicode-Strings (WideString) gibt Length die Byte-Anzahl geteilt durch zwei zurück" (delphi-Hilfe) also, wie in einigen Beiträgen empfohlen:
Delphi-Quellcode:
das funktioniert auch - nur das die doppelte Menge bytes gespeichert werden - oder wo ist der Denkfehler?
var astring:unicodestring;
s:tstream; i:integer; speichern i:=length(astring)*2 ;//*sizeof(char) s.write(i,sizeof(i)); s.write(pointer(astring)^,i); lesen s.Read(i,sizeof(i)); SetLength(astring,i div 2); s.Read(pointer(f_string)^,i); Beide Methoden funktionieren! MfG Uwe |
AW: Unicodestring in stream speichern
Ich nehme an, s ist vom Typ TStringStream? Der übernimmt nämlich automatisch die Multiplikation mit SizeOf(Char) in der write-Methode.
|
AW: Unicodestring in stream speichern
Zitat:
|
AW: Unicodestring in stream speichern
Der WideString ist auch längenabhängig.
> Zusatzinfos im ShortString (bis D2007 oder 2009) - Längenbyte (Byte) als Anzahl der Chars/Bytes ... PS: wegen diesem Byte (an Index 0), fangen unsere Strings mit 1 an > Zusatzinfos im AnsiString (bis D2007 oder 2009) - Längenbyte (Integer) als Anzahl der Chars/Bytes (Multibytes wären als mehrere AnsiChar gezählt) - Referenzzählung (Integer) - und hinten drann noch ein zusätzliches #0 für die PChar-kompatibilität > Zusatzinfos im AnsiString (seit D2009 oder 2010) - Längenbyte (Integer) als Anzahl der Chars - Referenzzählung (Integer) - Codepage (Word) - CharSize (Word) - und hinten drann noch ein zusätzliches #0 für die PChar-kompatibilität > Zusatzinfos im UnicodeString - Längenbyte (Integer) als Anzahl der Chars - Referenzzählung (Integer) - Codepage (Word) - CharSize (Word) - und hinten drann noch ein zusätzliches #0 für die PChar-kompatibilität > Zusatzinfos im WideStringString - Längenbyte (Integer) als Anzahl der Bytes - (hier bin ich mir nicht sicher, mit der zusätzlichen #0, aber ich glaub die gibt es nicht) Leerstrings sind NIL (abgesehn vom ShortString) und haben keine Zusatzinfos |
AW: Unicodestring in stream speichern
Zitat:
|
AW: Unicodestring in stream speichern
WideString ist immer mit der virtuellen Codepage 1200 (UTF-16), also Unicode mit 2 Byte pro Char.
Der UnicodeString ist uch immer 1200, aber in 2009/2010 und in XE+, mit aktiviertem StringChecking wäre theoretisch auch was anderes möglich ... durch das kranke StringChecking, könnte man auch in einen UnicodeString ANSI/ASCII reinstopfen und in einen AnsiString UTF-16/Unicode, ohne daß man was davon merkt, außer wenn man direkt auf den internen Speicher zugreifen will (Move, CopyMemory und Co.) |
AW: Unicodestring in stream speichern
Zitat:
Gibt es denn in D2009/10/XE denn keine Funktionen um String in Streams zu kopieren so wie Java/.NET das auch anbietet? |
AW: Unicodestring in stream speichern
Ja, es gibt bei UTF-16 die beiden Habvergessenwiedieheißen Zeichenpaare, aber dort die als 2 Zeichen gezählt.
|
AW: Unicodestring in stream speichern
Hi,
danke an alle Diskutanten - habe schon geahnt, daß ich eine Lawine zu dem Thema lostrete. @ DeddyH: ist einfach ein tstream und dennoch nehmen wir in meinem Beispiel an astring:='Willi' d.h. length(astring) ist 5 In meinem Beispiel 1 werden 5 Byte (?) gespeichert und wieder gelesen. Der Inhalt von Astring ist 'Willi'. In meinem Beispiel 2 werden 10 Byte (?) gespeichert und wieder gelesen. Läßt man hier SetLength(astring,i div 2) weg, steht in in Astring z.B. 'Willi#0blblab'. Danach geschehen unwägbare Dinge im Programm. Wieso muß ich diese 5 zusätzliche Byte speichern, die nichts mit dem String zu tun haben - wird ja durch #0 beendet? MfG Uwe |
AW: Unicodestring in stream speichern
Zitat:
Delphi-Quellcode:
AString := 'Klaus';
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:21 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