![]() |
String(unicode) in einen Stream speichern/Laden
Hi Leute,
ich möchte ein paar Propertys einer Klasse in einen Stream schreiben, diesen verschicken(das ist nicht das Problem) und wieder einlesen. Unter den Propertys befinden sich logischerweise auch ein paar Strings, für diese Strings sollten alle Zeichensätze unterstüzt werden. Worauf muss ich jetzt beim Schreiben/Laden des Streams achten, damit folgende Vorraussetzungen erfüllt sind : - Lauffähig unter Delphi2007 und Delphi2010 - Unterstüzung aller Zeichensätze Welche Stringtypen müssen jetzt verwendet werden ? String, Pchar, PAnsiChar, pWideChar, ... ? Für ein paar kurze Anregungen/Erklärungen wäre ich dankbar, Greetz Data |
Re: String(unicode) in einen Stream speichern/Laden
Delphi-Quellcode:
Also Unicode
für diese Strings sollten alle Zeichensätze unterstüzt werden.
> bis D2007 : WideString, WideChar-Array und PWideChar > ab D2009 : zusätzlich noch UnicodeString Abgesehn von einem statischen Array besteht alles aus einem Pointer und du mußt die Text-Daten selber in den Stream übertragen. Dazu gibt es noch TStringStream, welcher aber vor D2009 nur ANSI kann. |
Re: String(unicode) in einen Stream speichern/Laden
@himitsu:
Es war mir schon klar das ich den String selber in den Stream schreiben muss. Nur welche Stringtypen verwende ich das es unter den oben genannten Delphi-Version einwandfrei funktioniert und dabei Unicode unterstüzt ? Hier ein wenig Code-Bsp.:
Delphi-Quellcode:
Wie bekomm ich diesen Code, funktionsfähig für alle Zeichensätze und unter D2007 + D2010 lauffähig ?
{ TDummyTest }
procedure TDummyTest.SaveToStream(AStream: TStream); Var iLen : SmallInt; begin AStream.Position := 0; AStream.Size := 0; AStream.Write(FIdent,SizeOf(Integer)); AStream.Write(FKind,SizeOf(Integer)); iLen := Length(FStr1); AStream.Write(iLen,SizeOf(iLen)); AStream.Write(PChar(FStr1)^,iLen); // Hier PChar oder doch PWideChar ? AStream.Write(FRes,SizeOf(SmallInt)); end; procedure TDummyTest.LoadFromStream(AStream: TStream); procedure ReadStr(Var sTarget : String); Var iLen : SmallInt; pch : PChar; // oder PWideChar ? buffer : array[0..4096] of char; // Alternativ begin AStream.Read(iLen,SizeOf(SmallInt)); GetMem(pch,iLen); try //AStream.Read(pCh^,iLen); // alternativ AStream.Read(buffer[0],iLen); sTarget := copy(buffer,1,4); finally FreeMem(pCh,iLen); end; end; begin AStream.Read(FIdent,SizeOf(Integer)); AStream.Read(FKind,SizeOf(Integer)); ReadStr(FStr1); AStream.Read(FRes,SizeOf(SmallInt)); end; Danke, Greetz Data |
Re: String(unicode) in einen Stream speichern/Laden
Zitat:
![]() |
Re: String(unicode) in einen Stream speichern/Laden
Hi Himitsu,
den Thread hatte ich sogar schon gelesen bin mir bei der Bedeutung aber noch nicht 100% sicher, ist es also richtig das ich für meinem Fall mit PAnsiChar arbeiten soll und zum Speichern der Länge Länge * SizeOf(PAnsiChar) verwenden, richtig ? Danke Data |
Re: String(unicode) in einen Stream speichern/Laden
[quote="DataCool"]SizeOf(PAnsiChar)/quote]
Du meinst wohl SizeOf(AnsiChar) ohne das P, sonst wären das ein paar Byte zu viel pro Zeichen. |
Re: String(unicode) in einen Stream speichern/Laden
Wenn du nur ANSI haben willst, dann ist AnsiString, PAnsiChar und SizeOf(AnsiChar) OK,
ansonsten eben WideString, PWideChar und SizeOf(WideChar). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 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