【问题标题】:Rails html encodingRails html 编码
【发布时间】:2009-12-16 09:19:28
【问题描述】:

我在 Rails 中使用 h 辅助方法来编码/转义带有撇号 (') 的字符串在我看来,我正在像这样使用它

<%=h "Mike's computer" %>

我的理解是查看源码时的html应该是Mike%27s的电脑,但是生成的html里面有个撇号Mike的电脑

我是否遗漏了一些明显的东西?

我如何获得我想要的 Mike%27s 计算机的结果?

我们总是感谢您的帮助。

【问题讨论】:

    标签: html ruby-on-rails encoding


    【解决方案1】:

    撇号是 HTML 中的有效字符。它没有被编码,因为它不需要被编码。

    【讨论】:

    • @Darin Dimitrov,感谢您的回复。那么在那种情况下 gsub("'","%27") 是唯一的方法吗?还是有其他方法?
    • 您要查找的是 URL 编码,而不是 HTML 编码 - Google 引导我找到了这个:CGI::escape("Mike's Computer")
    • 达林告诉你不需要采取进一步行动。
    • @K Prime:确实,在发布此问题之前谷歌搜索也将我带到 CGI::escape ,但不确定如何在视图中使用它,并认为可能有其他方法可以实现所需的输出。
    【解决方案2】:

    如果要对 URL 进行编码,请使用 u 助手:

    >> fer@:~/$ script/console
    Loading development environment (Rails 2.3.8)
    >> include ERB::Util
    => Object
    >> h "Mike's computer"
    => "Mike's computer"
    >> u "Mike's computer"
    => "Mike%27s%20computer"
    >> 
    

    【讨论】:

      【解决方案3】:

      如果我们查看 h 方法的源代码(它是 html_escape 的别名),只需打开文件并在文件中的 HTML_ESCAPE 常量中添加单引号 (') 并不难。

      下面是该方法的源代码以及该方法在文件中的位置。找到常量和引号。你甚至可以在里面添加更多你想要的东西。

      HTML_ESCAPE = { '&' => '&amp;', '>' => '&gt;', '<' => '&lt;', '"' => '&quot;' }
      
      File actionpack/lib/action_view/template_handlers/erb.rb, line 17
      17:     def html_escape(s)
      18:       s.to_s.gsub(/[&"><]/) { |special| HTML_ESCAPE[special] }
      19:     end
      

      CAVEAT:此修改将影响使用该库的所有项目。

      或者另一种方法是在 ApplicationHelper 中创建一个视图辅助方法

      def h_with_quote(s)
        HTML_ESCAPE = { "'" => "%27"}
        h(s).gsub(/[']/) {|special| HTML_ESCAPE[special]}
      end
      

      这种方法应该更安全。

      【讨论】:

      • 你为什么要给 Rails 打补丁来做一些不需要的事情?
      • 这就是为什么我提出警告和替代答案,而不是猴子补丁。我认为开源的一个优势是你可以修改源代码来解决问题。对于这种情况,您有一个观点,因为可以使用替代方案。感谢您指出这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多