URI 等效于 Addressable 中的 encode_www_form_component

URI Equivalent of encode_www_form_component in Addressable

提问人:Josh 提问时间:11/9/2023 更新时间:11/13/2023 访问量:27

问:

中的等效方法是什么?URI.encode_www_form_componentAddressable::URI

Ruby URI 可寻址对象

评论

0赞 engineersmnky 11/9/2023
文档似乎您正在寻找或可能form_encodeencode_component

答:

1赞 Simone Carletti 11/13/2023 #1

最接近的方法是使用 #encode_component 方法。请注意,将使用全百分比模式,并将空格替换为 :Addressable%20+

Addressable::URI.encode_component('a decoded string with [email protected]', Addressable::URI::CharacterClasses::UNRESERVED)
# => "a%20decoded%20string%20with%20email%40example.com"

URI.encode_www_form_component('a decoded string with [email protected]')
# => "a+decoded+string+with+email%40example.com"

如果比较对一整套键/值参数进行编码的两种方法,则会发现它们的行为更相似:

[15] pry(main)> Addressable::URI.form_encode([["q", "a decoded string with [email protected]"]])
=> "q=a+decoded+string+with+email%40example.com"
[16] pry(main)> URI.encode_www_form([["q", "a decoded string with [email protected]"]])
=> "q=a+decoded+string+with+email%40example.com"

当我测试它时,我真的很惊讶。所以我深入研究了 Addressable 的源代码,我发现该方法明确替换为:form_encode%20+

escaped_form_values = form_values.map do |(key, value)|
  # Line breaks are CRLF pairs
  [
    self.encode_component(
      key.gsub(/(\r\n|\n|\r)/, "\r\n"),
      CharacterClasses::UNRESERVED
    ).gsub("%20", "+"),
    self.encode_component(
      value.gsub(/(\r\n|\n|\r)/, "\r\n"),
      CharacterClasses::UNRESERVED
    ).gsub("%20", "+")
  ]
end

因此,您可以选择以下选项:

  1. 按原样使用#encode_component
  2. 如果需要重现相同的输出,请使用并显式替换为#encode_component%20+
  3. 如果您有键/值表单字段,请使用#form_encode