【问题标题】:How can I get PreMailer.Net to not change the encoding of non-ascii characters?如何让 PreMailer.Net 不更改非 ascii 字符的编码?
【发布时间】:2020-02-22 04:21:30
【问题描述】:

我还在官方 repo 上以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 或内容。

【问题讨论】:

  • 将 encodeURIComponent 和 decodeURIComponent 用于此目的。如果需要,请参考
    Encoding Decoding(假设您可以访问 JavaScript)
  • @GalaxyCat105 - 我无法访问 JavaScript,这都是在 ASP.NET / C# 环境中运行的服务器端。

标签: html css premailer


【解决方案1】:

根据您的个人需求(仅供参考),请尝试以下方法:

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

更新:

这些行来自名为 AngleSharp 的 PreMailer.Net 依赖项的 132-139 行,它是一个 HTML 解析器。

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

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

【讨论】:

  • 好的,我会在哪里/如何使用它们?
  • 实际上,这看起来很有希望。我注释掉了其中一些行,假设它没有其他不良副作用,它看起来可能会解决我的问题。
  • 很高兴我能帮上忙 :)
【解决方案2】:

此问题已在 here 上讨论并已修复 here

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

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

【讨论】:

  • 所有这些都用于 Premailer - Ruby 实现。我正在使用 PreMailer.Net,但它似乎没有这些选项。
猜你喜欢
  • 2012-01-15
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多