url的这两个url编码有区别的原因是什么

What is the reason for the difference between these two urlencodings of url

我发送到服务器的一些编码为 UTF-8 的查询没有return预期结果。

http://direct.jthinkws.com?type=release&query=artist%3A%28Dinosaur%7E0.7+AND+Jr.%29++AND++%28%2Btrack%3A%22Forget+The+Swan%22+%2Btrack%3A%22Just+Like+Heaven%22+%29++AND+tracks%3A%5B2+TO+100%5D++AND+src%3A1&limit=20&offset=0

在我的应用程序中只有 return 两个结果(结果被 return 编辑为 Xml),如果我直接放入 Firefox 浏览器则只有 2 个结果

但是,如果我将未编码的 url 值放入 Firefox

http://direct.jthinkws.com?type=release&query=artist:(Dinosaur~0.7 AND Jr.) AND (+track:"Forget The Swan" +track:"Just Like Heaven" ) AND 曲目:[2 到 100] 和 src:1&limit=20&offset=0

它returns 44 个文件

从我的服务器上我可以看到我收到了以下请求,我认为它必须是对数据进行编码的 firefox

http://direct.jthinkws.com?type=release&query=artist:(Dinosaur~0.7%20AND%20Jr.)%20%20AND%20%20(+track:"Forget%20The%20Swan"%20+track:"Just%20Like%20Heaven"%20)%20%20AND%20tracks:[2%20TO%20100]%20%20AND%20src:1&limit=20&offset=0

如您所见,它的编码略有不同 - 空格被转换为“%20”而不是“+”,并且“(”和“)”未被转换。

我不明白其中的区别以及为什么一个有效而一个无效,也不明白为什么一个无效 return 有些结果没有那么多。

(我还尝试将编码编码为 ISO-8859-1 而不是 UTf-8),但完全失败了,服务器无法对其进行解码,所以我确定 UTf8 是正确的编码。

我的代码是用 Java 编写的,它使用 UREncoder 对查询值进行编码,即

String query = URLEncoder.encode(queryValue.toString(), StandardCharsets.UTF_8.name());

我用错了方法绕过我的代码实际上工作正常它应该只有 return 两个结果。

问题是 Firefox 无法正确编码 +,假设它们已经编码为空格。因此,您不能总是依赖 Firefox 正确编码您粘贴到其中的未编码 url。

这个问题不是 Firefox 特有的,可能是没有浏览器能够正确编码。因此,如果您使用的 url 包含“+”,请小心。