3

如何根据需要转义 URL,而不进行双重转义?

是否有一个已经这样做的 Ruby 库?我想知道 WebKit 或 Chrome 使用什么算法。

两个例子:

  • 此 URL 无效,因为%没有转义: http://x.co/op&k=21%。如果您在 URL 栏中键入它,它就会知道将其转义。(它正在逃避幕后的'%',对吗?)

  • 如果您http://localhost:3000/?s=hello%20world在浏览器中键入,它就知道不会再次转义%20

我想重用已经处理浏览器必须处理的边缘情况的优秀代码。如有必要,我不介意调用外部库。

更新:是的,我知道URI.parse。无需向我展示语法。我的问题这更难。

4

2 回答 2

1

到目前为止,获奖者是:

  • Addressable::URI#normalize:“返回一个规范化的 URI 对象。注意:此方法并不试图完全符合规范。它的存在主要是为了纠正其他人阅读规范的失败,以及处理缓存问题,因为几个不同的URI 可能代表相同的资源,不应多次缓存。”

  • Addressable::URI.heuristic_parse:“将输入转换为 URI。输入不必是有效的 URI - 该方法将使用启发式方法来猜测 URI 的意图。这不符合标准,只是用户友好。”

于 2012-07-30T18:30:20.383 回答
0

是否需要多次编码或解码取决于您自己。您是程序员,需要了解 URL 处于什么状态,因为您按摩它。

浏览器可以假设 a%后面没有数字值是裸露的,应该被转义。有关详细信息,请参阅“统一资源标识符 (URI):通用语法”。

您可以使用 Ruby 的内置URIAddressable::URI gems 进行编码/解码。

require 'uri'

uri = URI.parse('http://x.co/op')
uri.query = URI.encode_www_form('k' => '21%')

puts uri.to_s # => http://x.co/op?k=21%25

或者:

require 'addressable/uri'

uri = Addressable::URI.parse('http://x.co/op')
uri.query_values = {'k' => '21%'}
puts uri.to_s # => "http://x.co/op?k=21%25"
于 2012-07-30T17:07:35.690 回答