【发布时间】: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 相同的效果?
造成问题的原因:
- 在旧版 Winforms 屏幕中,用户创建/编辑现有电子邮件模板、预览它们、对呈现的示例感到满意、保存更改。
- 在新的 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 看起来是正确的。它们应编码为
&ldquo;和&rdquo;。 -
@RonBeyer 您的建议有效。但是,如果用户已经添加了不正确的“ ”而不是
&ldquo;&rdquo;怎么办?我确信我可以在渲染之前对它们进行替换,但很可能这些不会是唯一不正确的特殊字符。 -
特殊字符应该是 HTML 编码的,如果你有纯文本部分,你可以尝试对其进行清理或编码,但我不确定除了拥有特殊字符字典之外如何检测它与 HTML 编码的字符串相比,并对每个特殊字符进行蛮力查找/替换,注意不要碰到像
<或>这样应该在用户文本中编码但留在 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