uses ..., HTMLDefs;
...
function EntityToStr(const s: String): String;
const
EntityStartByte = 38;
EntityEndByte = 59;
var
StreamIn: TStringStream;
StreamOut: TStringStream;
Entity: String;
wc: WideChar;
b: Byte;
aPos: Int64;
StartCopy: Int64;
DummyOffset: Int64;
EntityEndSignal: Integer;
procedure SetStreamInPosition(Value: Int64);
begin
aPos := Value;
StreamIn.Position := Value;
end;
begin
Result := '';
StreamIn := TStringStream.Create(s);
StreamOut := TStringStream.Create;
try
if StreamIn.Size = 0 then Exit;
SetStreamInPosition(0);
StartCopy := 0;
while aPos < StreamIn.Size do
begin
b := StreamIn.Readbyte;
Inc(aPos);
if (b = EntityStartByte) then begin
DummyOffset := aPos;
EntityEndSignal := 0;
while (EntityEndSignal < 100) and (b <> EntityEndByte)
and (aPos + EntityEndSignal < StreamIn.Size) do
begin
b := StreamIn.Readbyte;
Inc(aPos);
Inc(EntityEndSignal);
end;
if b <> EntityEndByte then
begin
SetStreamInPosition(DummyOffset);
Continue;
end;
StreamIn.Position := DummyOffset;
Entity := StreamIn.ReadString(EntityEndSignal - 1);
if not ResolveHTMLEntityReference(UnicodeString(Entity), wc{%H-}) then
begin
SetStreamInPosition(DummyOffset);
Continue;
end;
StreamIn.Position := StartCopy;
aPos := DummyOffset;
if (aPos - StartCopy - 1 > 0) then
StreamOut.CopyFrom(StreamIn, aPos - StartCopy - 1);
Entity := UTF8Encode(WideCharLenToString(@wc, 1));
StreamOut.WriteString(Entity);
StartCopy := DummyOffset + EntityEndSignal;
SetStreamInPosition(StartCopy);
end;
end;
if (aPos - StartCopy - 1 > 0) then
begin
StreamIn.Position := StartCopy;
StreamOut.CopyFrom(StreamIn, aPos - StartCopy - 1);
end;
StreamOut.Position := 0;
Result := StreamOut.DataString;
finally
StreamOut.Free;
StreamIn.Free;
end;
end;