You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ruby中生成含%20编码的URI

嘿,这个需求我之前做项目的时候也遇到过,给你两个简便的解决方案,不用绕弯路:

方案一:手动用CGI.escape构建查询参数

CGI.escape会把空格编码成%20,刚好符合你的需求。我们可以遍历哈希的键值对,分别编码后再拼接成查询字符串:

query_params = { name: 'john doe' }.map do |key, value|
  "#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}"
end.join('&')

u = URI::HTTP.build(host: 'www.google.com', query: query_params)
u.to_s # 输出:http://www.google.com?name=john%20doe

这种方法完全避开了to_query的+编码逻辑,直接生成符合要求的格式。

方案二:基于to_query替换编码字符

如果你还是想保留to_query的便捷性(比如处理复杂哈希、嵌套参数的场景),可以在生成查询字符串后,把+替换成%20——这个操作很安全,因为to_query生成的+本质上就是空格的编码,不会和其他字符冲突:

query_string = { name: 'john doe' }.to_query.gsub('+', '%20')

u = URI::HTTP.build(host: 'www.google.com', query: query_string)
u.to_s # 输出:http://www.google.com?name=john%20doe

顺便说下为什么to_query会生成+:Rails的Hash#to_query底层用的是URI.encode_www_form,遵循的是application/x-www-form-urlencoded标准,这个标准里空格既可以用+也可以用%20,Rails默认选了+而已。

内容的提问来源于stack exchange,提问作者Jon Snow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:16:57