如何在 WPF 中呈现与在 Winforms 中相同的 HTML 中的特殊字符?

How do I render special characters in HTML the same in WPF as in Winforms?

我正在开发一个电子邮件通知项目,在这个项目中,客户可以在预先存在的 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 屏幕中,用户 creates/edits-existing 电子邮件模板,预览它们,对呈现的示例感到满意,保存更改。
  2. 在新的 WPF 屏幕中,用户 exports/imports 现有的电子邮件模板,预览它们,对呈现的示例和奇怪的字符不满意,当其他屏幕仍然正确呈现时变得困惑 - 调用报告 "bug" 在新屏幕中。

简单复制示例:-归功于Eser

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

只需将此 meta 标签添加到您的 HTML:

<head>
<meta charset='utf-8'>

这将正确显示特殊字符。我刚刚用这个测试了你的确切代码并且它有效。