【问题标题】:EXACT Ruby equivalent of Javascript's escape() functionEXACT Ruby 相当于 Javascript 的 escape() 函数
【发布时间】:2011-08-15 07:13:03
【问题描述】:

考虑字符串:` ( ?

Javascript 的 escape() 编码如下:

escape("` ( ?")
"%60%20%28%20%3F"

如何在 Ruby 中实现相同的效果?我尝试的任何方法都不起作用:

[Dev]> CGI.escape("` ( ?")
=> "%60+%28+%3F"
[Dev]> URI.encode("` ( ?")
=> "%60%20(%20?"
[Dev]> Addressable::URI.encode("` ( ?")
=> "%60%20(%20?"

【问题讨论】:

    标签: javascript ruby escaping


    【解决方案1】:

    ERB::Util.url_encode 会做到的:

    >> require 'erb'
    => true
    >> ERB::Util.url_encode("` ( ?")
    => "%60%20%28%20%3F"
    

    【讨论】:

    • 不是 javascript 转义的精确副本——对冒号的处理方式不同
    【解决方案2】:

    URI::encode 也采用正则表达式来匹配需要转义的不安全字符;你可以传递一个匹配任何字符的正则表达式:

    URI.encode("` ( ?", /./) # => "%60%20%28%20%3F"
    

    顺便说一句,来自Mozilla Developer Network

    escape 和 unescape 函数不适用于非 ASCII 字符,因此已被弃用。在 JavaScript 1.5 及更高版本中,使用 encodeURI、decodeURI、encodeURIComponent 和 decodeURIComponent。

    【讨论】:

    • 啊,但是encodeURIComponent() 不编码()!为什么比escape()更可取?
    • 根据 Mozilla 的说法,一个原因是它可以正确处理非 ASCII 字符。但为什么这对你很重要?任何体面的解码函数都可以处理这些结果。
    • 因为 URL 中的括号会破坏各种东西(自动链接逻辑、Markdown 逻辑等)
    • 另外,你的回答太过分了——我不想编码安全字符,URI.encode(" ( ?hi", /./) # => "%60%20%28%20%3F%68%69"
    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多