htmlelements unit from fcl-xml has both EscapeHTML and UnescapeHTML functions.
Or use XMLValueToStr() from laz2_dom (https://lazarus-ccr.sourceforge.io/docs/lazutils/laz2_dom/xmlvaluetostr.html).
procedure TForm1.Button1Click(Sender: TObject);const s = 'AA BB';begin Memo1.Lines.Add(XMLValueToStr(s)); Memo1.Lines.Add(StrToXMLValue(XMLValueToStr(s))); //Memo1.Lines.Add(XMLValueToStr(StrToXMLValue(XMLValueToStr(s)))); Memo1.Lines.Add(''); Memo1.Lines.Add(UnEscapeHTML(s)); Memo1.Lines.Add(EscapeHTML(UnEscapeHTML(s))); //Memo1.Lines.Add(UnEscapeHTML(EscapeHTML(UnEscapeHTML(s))));end;
AA BBAA 
 BBAA BBAA 
 BB
StringReplace(Value, '&#', '&#', [rfReplaceAll]);
But I'd like to keep "AA BB"...
This seems to me ugly code: