【问题标题】:How do I render special characters in HTML the same in WPF as in Winforms?如何在 WPF 中呈现与在 Winforms 中相同的 HTML 中的特殊字符?
【发布时间】:2015-10-07 20:55:01
【问题描述】:

我正在处理一个电子邮件通知项目,在该项目中,客户端可以在预先存在的 Winforms 屏幕中编辑电子邮件模板 - 添加 html、文本等。非常简化的示例输入:

<!DOCTYPE html> 
<html>
    <head>
        <title>The Title</title>
    </head>

    <body bgcolor="#f2f2f2" style="margin: 0; padding: 0;">
        <br />
            <b>Please do not respond to this e-mail, as it is not monitored.</b>
        <br/>
        <br/>
            “Foo bar baz.
        <br/>
        <br/>
            Baz bar foo.”
        <br/>
    </body>
</html>

这被保存为string。然后,在同一屏幕上,用户可以单击一个按钮,该按钮将在另一个表单上引发ShowDialog 调用。此表单在 WebBrowser 控件中预览用户的 html:

this.webBrowser.DocumentText = theHtmlString;

结果:

问题:

我正在创建一个与提到的 Winforms 屏幕相关的 WPF 屏幕。它也需要能够预览用户的 html。为此,我使用了从this version 修改的附加行为。本质上,此对话框还可以在 WebBrowser 控件中预览用户的 html:

webBrowser.NavigateToString(theHtmlString);

但是,结果不正确,如下所示:

如果这是我自己的 html 输入,我会简单地删除有问题的字符并用标准引号替换它们。但由于此输入来自客户端,我如何让 WPF 呈现与 Winforms 相同的效果

造成问题的原因:

  1. 在旧版 Winforms 屏幕中,用户创建/编辑现有电子邮件模板、预览它们、对呈现的示例感到满意、保存更改。
  2. 在新的 WPF 屏幕中,用户导出/导入现有的电子邮件模板,预览它们,对呈现的示例和奇怪的字符不满意,当另一个屏幕仍然正确呈现时变得困惑 - 调用报告中的“错误”新屏幕。

简单复制示例:-感谢Eser

var encoded = WebUtility.HtmlEncode(" “ Test ” ");             //" “ Test ” "
var buf = Encoding.UTF8.GetBytes(" “ Test ” "); 
var str = Encoding.GetEncoding("Windows-1252").GetString(buf); //" “ Test †"

【问题讨论】:

  • 我认为这些引号在 Winforms 方面无效,WPF 看起来是正确的。它们应编码为&amp;ldquo;&amp;rdquo;
  • @RonBeyer 您的建议有效。但是,如果用户已经添加了不正确的“ ”而不是 &amp;ldquo; &amp;rdquo; 怎么办?我确信我可以在渲染之前对它们进行替换,但很可能这些不会是唯一不正确的特殊字符。
  • 特殊字符应该是 HTML 编码的,如果你有纯文本部分,你可以尝试对其进行清理或编码,但我不确定除了拥有特殊字符字典之外如何检测它与 HTML 编码的字符串相比,并对每个特殊字符进行蛮力查找/替换,注意不要碰到像 &lt;&gt; 这样应该在用户文本中编码但留在 HTML 中的东西。
  • “ ” 字符不必进行 html 编码。您可以像这样测试它var encoded = WebUtility.HtmlEncode(" “ ” "); 这似乎是一个字符集/编码问题。这是一个重新生成它的测试用例。 var buf = Encoding.UTF8.GetBytes(" “ ” "); var str = Encoding.GetEncoding("Windows-1252").GetString(buf);

标签: c# html wpf winforms webbrowser-control


【解决方案1】:

只需将此 meta 标签添加到 HTML 的 &lt;head&gt;

<meta charset='utf-8'>

这将正确显示特殊字符。我刚刚用这个测试了你的确切代码,它可以工作。

【讨论】:

  • 谢谢!很少处理 html,我从来没有想过这一点。我的解决方案是确保创建这些模板的任何人都经过适当培训,可以使用实体名称、实体编号或十六进制引用,而不是复制粘贴。但这为那些想要复制粘贴/不知道在哪里可以找到此类特殊字符代码的人添加了一个不错的第四个选项。现有的错误只需按案例处理即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多