【问题标题】:How do I encode/decode HTML entities in Ruby?如何在 Ruby 中编码/解码 HTML 实体?
【发布时间】:2009-10-21 12:36:33
【问题描述】:

我正在尝试解码一些 HTML 实体,例如 '<' 变成 '<'

我有一颗旧宝石 (html_helpers),但它似乎被遗弃了两次。

有什么建议吗?我需要在模型中使用它。

【问题讨论】:

  • 刚刚找到'htmlentities' (htmlentities.rubyforge.org)
  • 我应该指定我从一堆不同的站点获取 html 并需要将其保存为数据库中的纯文本
  • 虽然投票最多的是使用 CGI,但不要。这就像拉动所有的主动支持来获得一个单一的方法。相反,请使用 HTMLEntities,如所选答案中所述。

标签: html ruby


【解决方案1】:

要对字符进行编码,可以使用CGI.escapeHTML:

string = CGI.escapeHTML('test "escaping" <characters>')

要解码它们,有CGI.unescapeHTML

CGI.unescapeHTML("test &quot;unescaping&quot; &lt;characters&gt;")

当然,在此之前你需要包含 CGI 库:

require 'cgi'

如果您在 Rails 中,则无需使用 CGI 对字符串进行编码。有h 方法。

<%= h 'escaping <html>' %>

【讨论】:

  • 我首先尝试了这种方法,但它不会变成像“ ”这样的实体进入 ” ”。我想我应该指定我从一堆不同的站点获取 html,并且需要将它作为纯文本保存在数据库中。
  • 如果您正在解码 HTML 实体以便在数据库中存储为纯文本,那么您的数据库会经常抱怨坏字符。编码实体被编码以允许它们作为纯文本传输。解码它们可以并且很可能会将它们恢复为高位集字符,AKA 二进制。几乎同样有可能,您最终可能会得到多字节字符,这会真正激怒期待纯文本的数据库。你最好先解码,直到没有任何变化,然后编码一次,以便一切都标准化,然后存储它们。
  • 我遇到过很多带有实体的 HTML 已经被多次编码,真的把事情弄得一团糟。查看loofah;如果我没记错的话,它的洗涤器就是为此而设计的。
  • 我们已经将我们的数据库设置为保存 Unicode,所以我怀疑它是否会抱怨。而且丝瓜不是我要找的东西,我不想摆脱 html 标签——反正现在不是。
  • 现在是 2015 年,unescapeHTML 仍然省略了一些实体,例如 A急性
【解决方案2】:

HTMLEntities可以做到:

: jmglov@laurana; sudo gem install htmlentities
Successfully installed htmlentities-4.2.4
: jmglov@laurana;  irb
irb(main):001:0> require 'htmlentities'
=> []
irb(main):002:0> HTMLEntities.new.decode "&iexcl;I&#39;m highly&nbsp;annoyed with character references!"
=> "¡I'm highly annoyed with character references!"

【讨论】:

【解决方案3】:

我觉得Nokogiri gem也是一个不错的选择。它非常稳定,拥有庞大的贡献社区。​​p>

样品:

a = Nokogiri::HTML.parse "foo&nbsp;b&auml;r"    
a.text 
=> "foo bär"

a = Nokogiri::HTML.parse "&iexcl;I&#39;m highly&nbsp;annoyed with character references!"
a.text
=> "¡I'm highly annoyed with character references!"

【讨论】:

  • @theTinMan,是的,我认为这取决于需求。从本主题的讨论中可以看出,CGI.escapeHTML 可能无法解决某些情况。另一方面,如果您需要全套支持,我相信Nokogiri 是一个不错的选择。
  • 另外,如果您已经在使用 Nokogiri 进行一些 HTML 解析,那么仅仅为此目的安装另一个 gem 是不合理的。例如,我使用 Sanitize gem 来清理 HTML。事实证明,这颗宝石在引擎盖下使用了 Nokogiri,所以不冒险使用它是一种耻辱。感谢@HoangLe 的提示!
  • 注意:CGI::escapeHTML 不会转义德文字符,例如 äöüß,也许还有更多……关于 Nokogiri,我还没有检查过,但这将是一个加分点。
  • HTMLEntities 将是一个轻量级且功能强大的选择。我经常使用 Nokogiri,除非我已经加载了它,否则我会使用 HTMLEntities。 CGI 已过时。
【解决方案4】:

要在 Rails 中解码字符,请使用:

<%= raw '<html>' %>

所以,

<%= raw '&lt;br&gt;' %>

会输出

<br>

【讨论】:

  • 这仅在视图中有效。我也需要在 ActiveRecord 中工作的东西。
  • 刚刚在调试器中测试过 - raw '&lt br &gt' ==> '&lt br &gt'。
  • #raw 不解码任何内容。它告诉视图 not 对字符串进行编码。它通过将字符串包装在ActiveSupport::SafeBuffer 中来做到这一点,而ActiveSupport::SafeBuffer 又具有一个设置为true 的标志(html_safe?)。视图使用此标志来确定字符串可以直接注入 HTML 而不被转义。我喜欢将html_safe 视为程序员的指示,表明有问题的字符串已被正确转义。
【解决方案5】:

如果您不想为此添加新的依赖项(例如HTMLEntities)并且您已经在使用Hpricot,它可以为您转义和取消转义。它处理的远远超过CGI

Hpricot.uxs "foo&nbsp;b&auml;r"
=> "foo bär"

【讨论】:

  • 现在看到这个的人请注意 - Hpricot 不再维护。
  • 使用 Nokogiri,这是 XML/HTML 解析的事实标准,而不是 Hpricot。
【解决方案6】:

你可以使用htmlasciigem:

Htmlascii.convert string

【讨论】:

    【解决方案7】:
    <% str="<h1> Test </h1>" %>
    
    result: &lt; h1 &gt; Test &lt; /h1 &gt;
    
    <%= CGI.unescapeHTML(str).html_safe %>
    

    【讨论】:

    • 我认为通过在任何用户输入的文本上添加 html_safe ,您是在告诉视图它是安全的,而它可能是不安全的。这会使您的用户在加载该视图时面临风险。
    • 我不知道为什么这么消极。我尝试了这个问题的所有解决方案。只有这样才能正常工作。关于 HTML 安全,用户想要渲染 HTML,那么 HTML_SAFE 是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多