AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Unicodestring in stream speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Unicodestring in stream speichern

Ein Thema von DrUArn · begonnen am 18. Aug 2011 · letzter Beitrag vom 19. Aug 2011
Antwort Antwort
Seite 1 von 2  1 2      
DrUArn

Registriert seit: 20. Mär 2003
130 Beiträge
 
Delphi 10.3 Rio
 
#1

Unicodestring in stream speichern

  Alt 18. Aug 2011, 12:44
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Unicodestring in stream speichern

  Alt 18. Aug 2011, 13:07
Ich nehme an, s ist vom Typ TStringStream? Der übernimmt nämlich automatisch die Multiplikation mit SizeOf(Char) in der write-Methode.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Unicodestring in stream speichern

  Alt 18. Aug 2011, 13:15
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?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Unicodestring in stream speichern

  Alt 18. Aug 2011, 13:25
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (18. Aug 2011 um 13:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Unicodestring in stream speichern

  Alt 18. Aug 2011, 13:29
Der WideString ist auch längenabhängig.
Meinte natürlich die länge eines Zeichen ist Codepageabhängig.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Unicodestring in stream speichern

  Alt 18. Aug 2011, 14:38
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.)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Unicodestring in stream speichern

  Alt 18. Aug 2011, 15:08
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?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Unicodestring in stream speichern

  Alt 18. Aug 2011, 16:51
Ja, es gibt bei UTF-16 die beiden Habvergessenwiedieheißen Zeichenpaare, aber dort die als 2 Zeichen gezählt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
DrUArn

Registriert seit: 20. Mär 2003
130 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Unicodestring in stream speichern

  Alt 18. Aug 2011, 20:31
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#10

AW: Unicodestring in stream speichern

  Alt 18. Aug 2011, 20:40
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 AString := 'Klaus';
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz