【问题标题】:Read HTML special characters in Delphi string读取 Delphi 字符串中的 HTML 特殊字符
【发布时间】:2021-08-18 08:30:50
【问题描述】:

我有一个使用 Expression Web 4 构建的网页“index.html”,其中包含一个以 id 分隔的值:

<html>
<head></head>
<body>
<... some html code ...>
<!--MYVALUEID-->
Dernières News
<... some html code ...>
</body>
</html>

使用我的 delphi 应用程序,我在 TStringList 中加载页面并将值读取到 TEDIT:

S:=TStringList.Create;
S.LoadFromFile('path\index.html');
Edit1.Text:=S[S.IndexOf('<!--MYVALUEID-->')+1];
S.Free;

问题是重音字符,因为我在 TEDIT 中得到了这个:“Dernières News”

在 Expression Web 代码中,文本是正确的:Dernières News

当我在记事本中打开 index.html 时,它会显示:Dernières News

记事本中的文件显示为UTF8

当我使用 HTTPApp.HTMLDecode() 时,我得到了:Dernières News

还有 System.NetEncoding、TNetEncoding.HTML.Decode :Dernières News

是否有可靠的例程来解码html特殊字符转换?

我在 SO 中检查了许多问题并尝试了上述解决方案,但没有任何反应。

提前谢谢,我卡住了。

【问题讨论】:

  • 您可能正在使用 Delphi 7,因此字符串是 ANSI 编码的,您无需采取任何措施来处理 UTF8。但这只是一个猜测。没有细节猜测是我们所能做的。
  • @DavidHeffernan OP 提到了System.NetEncoding.TNetEncoding,直到 Delphi XE7 才存在

标签: html delphi special-characters decode


【解决方案1】:

您可以使用UTF8ToWideStringUTF8 字符串转换为unicode 字符串:

S := TStringList.Create;
try
    S.LoadFromFile('path\index.html');
    Edit1.Text := UTF8ToWideString(S[S.IndexOf('<!--MYVALUEID-->') + 1]);
finally
    S.Free;
end;

【讨论】:

  • OP 显然使用的是 Unicode 版本的 Delphi,因此 TStringList 将保存 UTF-16 字符串,而不是 UTF-8 字符串,因此调用 UTF8ToWideString() 会产生更糟糕的结果。
  • @RemyLebeau 显然效果很好,在验证答案之前,我会尝试其他规格字符数次
  • 当然,在发布我的答案之前,我已经验证了我的解决方案是否有效。
  • @fpiette LoadFromFile() 没有指定 TEncoding.UTF8 可以正确解码包含非 ASCII 字符的 UTF-8 文件的唯一方法是该文件是否具有 UTF-8 BOM。但是UTF8ToWideString() 无法正常工作,因为它需要一个 UTF-8 编码的RawByteString 作为输入,但是传递一个UnicodeString 而不是将基于当前的DefaultSystemCodePage 执行运行时转换,这当然是默认情况下不会设置为CP_UTF8
  • @fpiette 我现在没有时间或机会来验证自己,但我几乎可以通过查看结果来保证结果是侥幸,而不是依赖。如果没有 BOM 或 TEncoding.UTF8LoadFromFile() 会错误地将该文件解码为 UTF-16,因此在调用 UTF8ToWideString() 之前会发生数据丢失,并且由于 UTF8ToWideString() 的输入不是有效的 UTF-8,因此结果不能依赖。它是否“有效”并不重要。逻辑是错误的。您所展示的内容仅适用于 Unicode 之前的 Delphi 版本,而不适用于现代 Unicode 版本。
【解决方案2】:

由于您的 HTML 文件是用 UTF-8 编码的,因此您应该在调用 LoadFromFile() 时指定它:

S := TStringList.Create;
S.LoadFromFile('path\index.html', TEncoding.UTF8);

否则使用ANSI编码。

【讨论】:

  • 我刚刚尝试并得到一个异常“目标多字节代码页中不存在 Unicode 字符的映射”!!!
  • @Stalkium 你用的是什么版本的Delphi?
  • 我在 RAD 10.3 上!
  • @Stalkium 看起来您的文件不是有效的 UTF-8。尝试使用一个非常简单的文件进行测试。
  • 我想我现在明白了,您的解决方案是最简单和最佳实践,而不是解码和编码。
【解决方案3】:

我认为我遇到了问题,但解决方案导致了另一个问题,我试图读取的文件是“header.html”(我将 index.html 仅用于示例),并且 header.html 将包含在 PHP 中在索引文件中,因此不包含任何头部或正文信息,以避免包含 HTML 混乱,因此它不是由 Expression WEB 编码的 UTF8,....当我添加“UTF8 元内容”到文件告诉编辑器对其进行编码,现在它可以工作了。

但是我现在添加的问题是:

<head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></head>

编辑器显示来自 header.html 的 BOM 删除请求的对话框,以避免在浏览器上显示空格(这是真的),所以如果我删除它,文档会丢失他的 UTF8,如果我保留它一个空格将显示在浏览器上,

我知道这应该是另一个问题,所以我将删除 BOM 并使用 fpiette 解决方案来读取数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多