Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Unicodestring in stream speichern (https://www.delphipraxis.net/162346-unicodestring-stream-speichern.html)

DrUArn 18. Aug 2011 12:44

Unicodestring in stream speichern
 
Hi,

ich habe mir einige der Diskussionen über das Speichern von String (Unicode) durchgelesen und selbst experimentiert

Delphi-Quellcode:
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);
das funktioniert sogar!

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:
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);
das funktioniert auch - nur das die doppelte Menge bytes gespeichert werden - oder wo ist der Denkfehler?

Beide Methoden funktionieren!

MfG
Uwe

DeddyH 18. Aug 2011 13:07

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.

Bernhard Geyer 18. Aug 2011 13:15

AW: Unicodestring in stream speichern
 
Zitat:

Zitat von DrUArn (Beitrag 1117837)
wiederspricht folgendem Fakt: "Bei Unicode-Strings (WideString) gibt Length die Byte-Anzahl geteilt durch zwei zurück" (delphi-Hilfe)

Du musst bedenken das der Unicode-String gegenüber dem "alten" WideString Längenabhängig ist. D.h. du kannst alles von Ansi/UTF8/UCS2/... reinschmeißen und über das Codierungsinformationen passt das dann schon. Der Widestring dagegen kennt nur 1 Char = 2 Byte so das dieser die besagte Regel hat. Was steht den bei deinem Widestring so als Codierungsinfo drin?

himitsu 18. Aug 2011 13:25

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

Bernhard Geyer 18. Aug 2011 13:29

AW: Unicodestring in stream speichern
 
Zitat:

Zitat von himitsu (Beitrag 1117847)
Der WideString ist auch längenabhängig.

Meinte natürlich die länge eines Zeichen ist Codepageabhängig.

himitsu 18. Aug 2011 14:38

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.)

Bernhard Geyer 18. Aug 2011 15:08

AW: Unicodestring in stream speichern
 
Zitat:

Zitat von himitsu (Beitrag 1117869)
WideString ist immer mit der virtuellen Codepage 1200 (UTF-16), also Unicode mit 2 Byte pro Char.

Hüstel. War bei UCS2 der Fall. Bei UTF-16 kann ein Character 2 bzw 4 Bytes umfassen. Eingeführt wurde das mit Unicode 4.0 und alle modernen System (Java/.NET/W2K und neuer) unterstützen das. Aber jetzt wirds langsam zu detailiert.

Gibt es denn in D2009/10/XE denn keine Funktionen um String in Streams zu kopieren so wie Java/.NET das auch anbietet?

himitsu 18. Aug 2011 16:51

AW: Unicodestring in stream speichern
 
Ja, es gibt bei UTF-16 die beiden Habvergessenwiedieheißen Zeichenpaare, aber dort die als 2 Zeichen gezählt.

DrUArn 18. Aug 2011 20:31

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

Uwe Raabe 18. Aug 2011 20:40

AW: Unicodestring in stream speichern
 
Zitat:

Zitat von DrUArn (Beitrag 1117941)
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'.

Setz doch vor dem Lesen von Astring mal
Delphi-Quellcode:
AString := 'Klaus';


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:21 Uhr.
Seite 1 von 2  1 2      

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