如何让 PreMailer.Net 不更改非 ascii 字符的编码?

How can I get PreMailer.Net to not change the encoding of non-ascii characters?

我也将我的问题作为 Github Issue 发布在官方仓库中。

我正在使用 PreMailer.Net 将 CSS 内联到 HTML 文档中。但是,当我调用 MoveCssInline 时,它​​会编码非 ASCII 字符,例如“&”。例如:

<a href="http://www.website.com/page?param1=a&param2=b"></a>

改为:

<a href="http://www.website.com/page?param1=a&amp;param2=b"></a>

我认为这种行为仅限于 URL 和 href 值,但事实证明它也编码 innerHTML/content。例如:

另外,我进一步测试发现这种编码不只是对href这样的属性进行编码。事实上,它还将对 text/InnerHTML 值进行编码,这些值在没有编码的情况下绝对有效 html。示例:

<p>&</p>

这是有效的 HTML,不应进行编码,但 PreMailer.Net 会将其更改为:

<p>&amp;</p>

有人对此有修复或解决方法吗?我无法控制 HTML 文档,除了内联 CSS.

之外,我不允许更改 URL 或内容

此问题已讨论 here and fixed here

您应该使用 this 文件中提到的这些选项。

:input_encoding => 'ASCII-8BIT',
:output_encoding => nil,

根据您的个人需求,仅作为指南,尝试以下方法:

        Symbols.Ampersand: temp.Append("&amp;")
        Symbols.NoBreakSpace: temp.Append("&nbsp;")
        Symbols.GreaterThan: temp.Append("&gt;")
        Symbols.LessThan: temp.Append("&lt;")

更新:

这些行来自第 132-139 of a PreMailer.Net dependency called AngleSharp 行,这是一个 HTML 解析器。

目前,据我所知编码在 AngleSharp 上是强制性的,因此 AngleSharp 或 PreMailer.Net 中的任何设置都无法避免编码。

根据以下 closed issue,这是根据 HTML 规范设计的。但是,我认为仍然存在一个错误,因为它应该只编码属性值,而不是内部 HTML 内容。此外,我不认为这是 CSS 内联器可接受的行为,它不应该验证或清理 HTML。此外,我什至认为解析器不应该进行客户端未要求的更改。