//**********************************************************************************************
// MGReader.pas
//
//
Unit für den Workaround des bei Embacadero gemeldeten Fehlers RSP-31215
// Mit dem tMGReader werden die Umlaute wieder korrekt gelesen
//
// Link zum Fehler: https://quality.embarcadero.com/browse/RSP-31215
//
// Autor: Michael Groß
// Stand: 08.10.2020
//
//***************************************************************************************
unit MGReader;
interface
uses
System.Classes, System.SysUtils, System.RTLConsts;
type
tMGReader=class(tReader)
private
public
function ReadString:String; reintroduce;
end;
implementation
procedure ReadError(Ident: PResStringRec); overload;
begin
raise EReadError.CreateRes(Ident) at ReturnAddress;
end;
procedure PropValueError;
begin
ReadError(@SInvalidPropertyValue);
end;
function TMGReader.ReadString:String;
var
L: Integer;
LResult: TBytes;
// S: ShortString;
begin
L := 0;
case ReadValue of
vaWString:
begin
Read(L, SizeOf(Integer));
SetLength(LResult, L*sizeof(WideChar));
Read(LResult, L*sizeof(WideChar));
Result := TEncoding.Unicode.GetString(LResult);
end;
vaUTF8String:
begin
Read(L, SizeOf(Integer));
SetLength(LResult, L);
Read(LResult, L);
Result := TEncoding.UTF8.GetString(LResult);
end;
(*
das war Original bei 10.4.1
vaString:
begin
Read(S[0], SizeOf(Byte));
Read(S[1], NativeInt(S[0]));
Result := UTF8IdentToString(@S);
end;
*)
vaString: //übernommen aus 10.3.3, damit funktionieren die Umlaute wieder
begin
Read(L, SizeOf(Byte));
SetLength(LResult, L);
Read(LResult, L);
Result := TEncoding.Default.GetString(LResult);
end;
vaLString:
begin
Read(L, SizeOf(Integer));
SetLength(LResult, L);
Read(LResult, L);
Result := TEncoding.Default.GetString(LResult);
end;
else
PropValueError;
end;
end;
end.