为什么URI.escape
没有单引号?
URI.escape("foo'bar\" baz")
=> "foo'bar%22%20baz"
答案 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格式。)。