* Better Ansi/WideString support for TStream. Fix StringStream with unicode to be delphi compatible

This commit is contained in:
Michaël Van Canneyt 2023-01-13 18:06:38 +01:00
parent 885a265edb
commit ec65ed9e64
2 changed files with 56 additions and 8 deletions

View File

@ -1131,12 +1131,14 @@ type
function ReadWord : Word;
function ReadDWord : Cardinal;
function ReadQWord : QWord;
function ReadAnsiString : String;
function ReadAnsiString : AnsiString;
function ReadUnicodeString : WideString;
procedure WriteByte(b : Byte);
procedure WriteWord(w : Word);
procedure WriteDWord(d : Cardinal);
procedure WriteQWord(q : QWord);
Procedure WriteAnsiString (const S : String); virtual;
Procedure WriteAnsiString (const S : AnsiString); virtual;
Procedure WriteUnicodeString (const S : UnicodeString); virtual;
property Position: Int64 read GetPosition write SetPosition;
property Size: Int64 read GetSize write SetSize64;
end;
@ -1257,7 +1259,8 @@ type
private
FEncoding: TEncoding;
FOwnsEncoding : Boolean;
function GetDataString: string;
function GetAnsiDataString: AnsiString;
function GetDataString: RTLString;
function GetUnicodeDataString: UnicodeString;
protected
public
@ -1277,7 +1280,8 @@ type
procedure WriteAnsiString(const AString: AnsiString); override;
function ReadString(Count: Longint): string;
procedure WriteString(const AString: string);
property DataString: string read GetDataString;
property DataString: RTLString read GetDataString;
Property AnsiDataString : AnsiString Read GetAnsiDataString;
Property UnicodeDataString : UnicodeString Read GetUnicodeDataString;
Property OwnsEncoding : Boolean Read FOwnsEncoding;
Property Encoding : TEncoding Read FEncoding;

View File

@ -1218,7 +1218,7 @@ end;
end;
function TStream.ReadAnsiString: String;
function TStream.ReadAnsiString: AnsiString;
Var
TheSize : Longint;
@ -1236,7 +1236,24 @@ end;
end;
end;
procedure TStream.WriteAnsiString(const S: String);
function TStream.ReadUnicodeString: WideString;
Var
TheSize : Longint;
P : PByte ;
begin
Result:='';
ReadBuffer (TheSize,SizeOf(TheSize));
SetLength(Result,TheSize);
// Illegal typecast if no AnsiStrings defined.
if TheSize>0 then
begin
ReadBuffer (Pointer(Result)^,TheSize*SizeOf(unicodeChar));
P:=Pointer(Result)+TheSize*SizeOf(UnicodeChar);
PWord(p)^:=0;
end;
end;
procedure TStream.WriteAnsiString(const S: AnsiString);
Var L : Longint;
@ -1246,6 +1263,15 @@ end;
WriteBuffer (Pointer(S)^,L);
end;
procedure TStream.WriteUnicodeString(const S: UnicodeString);
Var L : Longint;
begin
L:=Length(S);
WriteBuffer (L,SizeOf(L));
WriteBuffer (Pointer(S)^,L*SizeOf(UnicodeChar));
end;
procedure TStream.WriteByte(b : Byte);
begin
@ -1601,7 +1627,16 @@ end;
{* TStringStream *}
{****************************************************************************}
function TStringStream.GetDataString: string;
function TStringStream.GetDataString: RTLString;
begin
{$IF SIZEOF(CHAR)=1}
Result:=GetAnsiDataString;
{$ELSE}
Result:=GetUnicodeDataString;
{$ENDIF}
end;
function TStringStream.GetAnsiDataString: AnsiString;
begin
Result:=FEncoding.GetAnsiString(Bytes,0,Size);
end;
@ -1644,21 +1679,30 @@ begin
inherited Create(BytesOf(AString));
end;
<<<<<<< HEAD
constructor TStringStream.Create(const AString: string; AEncoding: TEncoding; AOwnsEncoding: Boolean);
=======
constructor TStringStream.Create(const AString: Ansistring;
AEncoding: TEncoding; AOwnsEncoding: Boolean);
>>>>>>> be8e86f382 (* Better Ansi/WideString support for TStream. Fix StringStream with unicode to be delphi compatible)
begin
FOwnsEncoding:=AOwnsEncoding and not TEncoding.IsStandardEncoding(AEncoding);
FEncoding:=AEncoding;
Inherited Create(AEncoding.GetAnsiBytes(AString));
end;
<<<<<<< HEAD
constructor TStringStream.Create(const AString: string; ACodePage: Integer);
=======
constructor TStringStream.Create(const AString: Ansistring; ACodePage: Integer);
>>>>>>> be8e86f382 (* Better Ansi/WideString support for TStream. Fix StringStream with unicode to be delphi compatible)
begin
Create(AString,TEncoding.GetEncoding(ACodePage),true);
end;
constructor TStringStream.Create(const AString: UnicodeString);
begin
Create(AString,TEncoding.Unicode,false);
Create(AString,TEncoding.Default,false);
end;
constructor TStringStream.Create(const AString: UnicodeString; AEncoding: TEncoding; AOwnsEncoding: Boolean);