提问人:Josh 提问时间:11/9/2023 更新时间:11/13/2023 访问量:27
URI 等效于 Addressable 中的 encode_www_form_component
URI Equivalent of encode_www_form_component in Addressable
答:
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
因此,您可以选择以下选项:
- 按原样使用
#encode_component
- 如果需要重现相同的输出,请使用并显式替换为
#encode_component
%20
+
- 如果您有键/值表单字段,请使用
#form_encode
评论
form_encode
encode_component