在 Java 中编码 URL 查询参数

新手上路,请多包涵

如何编码查询参数以在 Java 中的 url 上进行?我知道,这似乎是一个显而易见且已经问过的问题。

我不确定有两个微妙之处:

  1. 空格应该在 url 上编码为“+”还是“%20”?在 chrome 中,如果我输入“http://google.com/foo=?bar me”,chrome 会将其更改为使用 %20 进行编码
  2. 将冒号“:”编码为 %3B 是否必要/正确?铬没有。

笔记:

  • java.net.URLEncoder.encode 似乎不起作用,似乎是为了编码要提交的数据。例如,它将空格编码为 + 而不是 %20 ,并对不必要的冒号进行编码。
  • java.net.URI 不对查询参数进行编码

原文由 Alex Black 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 962
2 个回答

不幸的是, URLEncoder.encode() 不会产生有效的百分比编码(如 RFC 3986 中所指定)。

URLEncoder.encode() 编码一切都很好, 除了 空间被编码为“+”。我能找到的所有 Java URI 编码器都只公开公共方法来对查询、片段、路径部分等进行编码——但不公开“原始”编码。这很不幸,因为允许片段和查询将空格编码为 +,因此我们不想使用它们。路径已正确编码,但首先被“规范化”,因此我们也不能将其用于“通用”编码。

我能想到的最佳解决方案:

 return URLEncoder.encode(raw, "UTF-8").replaceAll("\\+", "%20");

如果 replaceAll() 对你来说太慢了,我想另一种选择是推出你自己的编码器……

编辑:我首先在这里输入了这段代码,它没有正确编码“?”、“&”、“=”:

 //don't use - doesn't properly encode "?", "&", "="
new URI(null, null, null, raw, null).toString().substring(1);

原文由 Kosta 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏