为什么URI.escape不能单引号?

时间:2011-10-11 20:12:15

标签: ruby url uri

为什么URI.escape没有单引号?

URI.escape("foo'bar\" baz")
=> "foo'bar%22%20baz"

4 个答案:

答案 0 :(得分:10)

出于同样的原因,它不会逃脱?/:,依此类推。 URI.escape()仅转义不能在 URL 中使用的字符,而不是具有特殊含义的字符。

您要找的是CGI.escape()

require "cgi"
CGI.escape("foo'bar\" baz")
=> "foo%27bar%22+baz"

答案 1 :(得分:4)

这是一个老问题,但答案在很长一段时间内都没有更新。我以为我会为遇到同样问题的其他人更新这个。我找到的解决方案是posted here:如果您有ERB::Util.url_encode模块,请使用erb。这照顾单引号&我也是*

CGI::escape无法正确转义空格(%20)与加号。

答案 2 :(得分:1)

根据文档,URI.escape(str [, unsafe])使用匹配所有必须用代码替换的符号的正则表达式。默认情况下,该方法使用REGEXP :: UNSAFE。当此参数是String时,它表示字符集。

在您的情况下,要修改URI.escape以逃避单引号,您可以执行以下操作...

reserved_characters = /[^a-zA-Z0-9\-\.\_\~]/
URI.escape(YOUR_STRING, reserved_characters)

说明:有关规范的一些信息......

  

使用[rfc3986]转义所有参数名称和值   百分比编码(%xx)机制。字符不在无保留   必须对字符集([rfc3986]第2.3节)进行编码。中的人物   不得对未保留的字符集进行编码。十六进制   编码中的字符必须为大写。文本名称和值必须   在[rfc3629]按百分比编码之前编码为utf-8个八位字节。

答案 3 :(得分:0)

我知道这已经得到了解答,但我想要的是略有不同的东西,我想我也可以发布它:我想保留" /"在url中,但是转义所有其他非标准字符。我这样做了:

#public filename is a *nix filepath, 
#like `"/images/isn't/this a /horrible filepath/hello.png"`

public_filename.split("/").collect{|s| ERB::Util.url_encode(s)}.join("/")
=> "/images/isn%27t/this%20a%20/horrible%20filepath/hello.png"

当我为AWS Cloudfront编写缓存失效时,我需要逃避单引号,它不喜欢单引号并期望它们被转义。上面应该创建一个比标准URI.escape更安全的uri但仍然看起来像一个URI(CGI Escape通过转义" /"来打破uri格式。)。