You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:57:27