为什么 Rails 2 中的 HTML 编码撇号会产生意想不到的结果?

tis*_*was 2 html ruby encode ruby-on-rails apostrophe

我正在使用hHTML 对 Rails 2 中的一些文本进行编码,但是我遇到了撇号问题。更准确地说,我发现我的撇号最终'显然不是我想要显示的。

任何人都知道为什么会发生这种情况?我的研究暗示 HTML 编码不应该影响撇号。

the*_*Man 5

这是个有趣的问题。我发现hAKAhtml_escape处理撇号 AKA的方式不一致"'"

根据ERB::Util 2.6.6的 RDoc :

ESCAPE_TABLE = { '&'=>'&amp;', '<'=>'&lt;', '>'=>'&gt;', '"'=>'&quot;', "'"=>'&#039;', }

gem list erubis
*** LOCAL GEMS ***
erubis (2.6.6)
Run Code Online (Sandbox Code Playgroud)

在 IRB 中,我看到:

Welcome to IRB. You are using ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10.5.0]. Have fun ;)
>> require 'erb' #=> true
>> ERB::Util.html_escape("foo'bar") #=> "foo'bar"
>> ERB::Util.html_escape('foo"bar') #=> "foo&quot;bar"
Run Code Online (Sandbox Code Playgroud)

编辑:

呵呵,这是方法中的一个错误,或者至少是不一致h。这是来源:

# File 'lib/erubis/helpers/rails_helper.rb', line 342

def h(value)
  value.to_s.gsub(/[&<>"]/) {|s| ESCAPE_TABLE[s] }
end
Run Code Online (Sandbox Code Playgroud)

注意传递给的字符串gsub不包含"'"? 这意味着不会为单引号/撇号调用 ESCAPE_TABLE 的查找。

而且,我们都知道饼干的关键是撇号。:-)

我希望如果我查看Rails 版本hhtml_escapeRails 版本中的定义,我们会发现该字符串中包含撇号。

修复方法是升级您的 ERB/Erubis,或者覆盖h/html_escape定义以使其正确。您可以使用上面的定义作为起点。