Delphi项目REST响应HTML实体解码失败,求解决方案
解决Delphi中REST响应HTML实体解码的问题
嘿,我之前也碰到过一模一样的情况——调用REST接口拿到的字段里全是ä、'这类HTML实体编码,用THTMLEncoding.HTML.Decode死活没效果。下面给你几个亲测有效的方案:
优先推荐:用System.NetEncoding.TNetEncoding.HTML.Decode
从Delphi XE8开始,官方在System.NetEncoding单元里提供的TNetEncoding.HTML解码工具,比旧的THTMLEncoding靠谱得多,不管是命名实体(比如ä)还是十进制实体(比如'),甚至嵌套的编码(像你示例里的ä)都能一次性处理好。直接上代码:
uses System.NetEncoding; var EncodedText, DecodedText: string; begin EncodedText := '"raär"'; DecodedText := TNetEncoding.HTML.Decode(EncodedText); // 这时候DecodedText就是"raär"了 end;
旧版Delphi的替代方案:手动替换实体
如果你的Delphi版本比较老(比如低于XE8),没有TNetEncoding,那只能手动写个替换函数,把常见的实体对应替换成正常字符。示例代码如下:
function DecodeHTMLEntities(const AEncodedStr: string): string; begin Result := AEncodedStr; // 先处理嵌套的&,不然其他实体没法正常解码 Result := StringReplace(Result, '&', '&', [rfReplaceAll]); // 替换常用命名实体 Result := StringReplace(Result, '"', '"', [rfReplaceAll]); Result := StringReplace(Result, 'ä', 'ä', [rfReplaceAll]); Result := StringReplace(Result, 'ë', 'ë', [rfReplaceAll]); Result := StringReplace(Result, 'à', 'à', [rfReplaceAll]); // 替换十进制实体 Result := StringReplace(Result, ''', '''', [rfReplaceAll]); // 要是还有其他实体,直接照着这个格式加就行 end;
这种方法的缺点是需要你提前知道要处理的实体类型,但应付大多数场景足够了。
为什么THTMLEncoding.HTML.Decode没用?
说白了就是旧版的THTMLEncoding功能太弱——它可能只能处理最基础的几个实体,而且不会自动处理嵌套编码(比如你示例里的ä,它可能只会解码&成&,剩下的ä就不管了)。而TNetEncoding.HTML.Decode会递归处理这些嵌套的情况,所以效果好很多。
内容的提问来源于stack exchange,提问作者Ravaut123
相关产品推荐
相关产品推荐

