Ruby URI合并和转义

Ruby URI合并和转义,ruby,uri,Ruby,Uri,我有一个URI对象 require 'uri' uri = URI.parse 'http://example.com' 我需要将一些路径合并到此URI path = URI.escape('/?foo[123]=5') uri.merge!(path) 以及获得异常: URI::InvalidURIError: bad URI(is not URI?): /?foo[123]=5 这是因为路径中的某些符号被视为不安全(“[”和“]”), 但是这些符号不是通过URI.escape转义的 我

我有一个URI对象

require 'uri'
uri = URI.parse 'http://example.com'
我需要将一些路径合并到此URI

path = URI.escape('/?foo[123]=5')
uri.merge!(path)
以及获得异常:

URI::InvalidURIError: bad URI(is not URI?): /?foo[123]=5
这是因为路径中的某些符号被视为不安全(“[”和“]”), 但是这些符号不是通过URI.escape转义的

我正在使用两个URI.escape调用解决此问题:

path = URI.escape(URI.escape('/?foo[123]=5'), '[]')
uri.merge!(path)
问题是:为什么URI.escape在默认情况下不执行这种转义


或者有更好的方法吗?

使用
CGI.escape
而不是
URI.escape

require 'uri'
require 'cgi'
uri = URI.parse 'http://example.com'    
path = CGI.escape('/?foo[123]=5')
uri.merge!(path) #=> #<URI::HTTP:0x00000002947918 URL:http://example.com/%2F%3Ffoo%5B123%5D%3D5>
require'uri'
需要“cgi”
uri=uri.parse'http://example.com'    
path=CGI.escape('/?foo[123]=5')
合并!(路径)#=>#
它的规格 检查

请注意,问号很可能应该保留为未编码。感谢您提供的链接,看起来URI.escape将被贬值。