如何在Ruby中编码/解码HTML实体?

如何在Ruby中编码/解码HTML实体?,html,ruby,Html,Ruby,我正在尝试解码一些HTML实体,例如”&;lt;'变成”要编码字符,可以使用CGI.escapeHTML: string = CGI.escapeHTML('test "escaping" <characters>') CGI.unescapeHTML("test &quot;unescaping&quot; &lt;characters&gt;") 当然,在此之前,您需要包括CGI库: require 'cgi' 如果您在Rails中,则

我正在尝试解码一些HTML实体,例如
”&;lt;'
变成
”要编码字符,可以使用
CGI.escapeHTML

string = CGI.escapeHTML('test "escaping" <characters>')
CGI.unescapeHTML("test &quot;unescaping&quot; &lt;characters&gt;")
当然,在此之前,您需要包括CGI库:

require 'cgi'
如果您在Rails中,则不需要使用CGI对字符串进行编码。这里有
h
方法

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

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

<%= raw '<html>' %>

所以


将输出

<br>

可以做到:

: 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!"

如果您不想添加一个新的依赖项来执行此操作(如
HTMLEntities
),并且您已经在使用
Hpricot
,它可以为您转义和取消转义。它处理的不仅仅是CGI

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

您可以使用
htmlascii
gem:

Htmlascii.convert string
我认为这也是一个不错的选择。它非常稳定,有一个巨大的贡献社区

样本:

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


结果:h1测试/h1


Just found'htmlentities'()我应该指定我从一堆不同的站点获取html,并需要将其保存为数据库中的纯文本,而大多数投票都是使用CGI,不要这样做。这就像是把所有的主动支持都拉进来,得到一个单一的方法。相反,使用HTMLEntities,如所选答案中所述。我首先尝试了这种方法,但它不会将诸如“”之类的实体转换为“”。我想我应该指定我从一堆不同的站点获取html,并需要将其保存为数据库中的纯文本。如果您正在解码html实体以存储为数据库中的纯文本,那么您的数据库可能会抱怨很多错误字符。对编码实体进行编码,以允许它们作为纯文本传输。解码它们可以,而且很可能会,将它们还原为高位集字符,即二进制。几乎同样可能的是,您最终可能会使用多字节字符,这将真正激怒需要纯文本的数据库。你最好先解码,直到没有任何变化,然后编码一次,这样所有东西都会正常化,然后再存储它们。我遇到过很多HTML,其中的实体已经编码多次,真的把事情弄得一团糟。退房如果我没记错的话,它的洗涤器就是为此而设计的。我们已经将数据库设置为保存Unicode,所以我怀疑它是否会抱怨。丝瓜不是我要找的,我不想去掉html标签——至少现在不是。2015年,unescapeHTML仍然省略了一些实体,比如acuteThis,但它只在视图中工作。我也需要在ActiveRecord中工作的东西。只需在调试器-raw'< br>'==>'< br>'中测试。
\raw
不会解码任何东西。它告诉视图不要对字符串进行编码。它通过将字符串包装在
ActiveSupport::SafeBuffer
中来实现这一点,而该字符串又有一个设置为true的标志(
html\u safe?
)。视图使用此标志来确定可以直接将字符串注入HTML而无需转义。我喜欢将
html\u-safe
看作程序员的一种指示,表明所讨论的字符串已经正确转义。谢谢你的评论;它也解决了我的问题!是的,
HTMLEntities
gem处理
å
&mdash
而不是CGI.unescapeHTML。请注意,现在看这个的人-不再维护Hpricot。使用,这是XML/HTML解析的实际标准,而不是Hpricot。@theTinMan,是的,我认为这取决于需求。正如您在本主题的讨论中所看到的,
CGI.escapeHTML
可能无法解决某些情况。另一方面,如果您需要全套支持,我相信
Nokogiri
是一个不错的选择。另外,如果您已经在使用Nokogiri进行一些HTML解析,那么仅为此目的安装另一个gem是不合理的。例如,我正在使用Sanitize gem清理HTML。原来这颗宝石在引擎盖下使用了Nokogiri,所以如果不冒险的话,那就太可惜了。谢谢@HoangLe的提示!注意:
CGI::escapeHTML
不转义像äöüß这样的德语字符,可能还有更多。。。对于Nokogiri,我还没有检查,但这将是一个加分。HTMLEntities将是一个轻量级的、有能力的选择。我经常使用Nokogiri,除非我已经加载了它,否则我会使用HTMLEntities。CGI已经过时了。我认为,通过在用户输入的任何文本上添加html_safe,可以告诉视图它是安全的,但它可能不安全。这会让你的用户在加载该视图时面临风险。我不知道为什么会如此消极。我尝试了这个问题的所有解决方案。只有这个好用。关于HTML安全,用户希望呈现HTML,那么HTML\u安全是正确的。
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!"
<% str="<h1> Test </h1>" %>

result: &lt; h1 &gt; Test &lt; /h1 &gt;

<%= CGI.unescapeHTML(str).html_safe %>