URLDecoder 正在将 '+' 转换为空格

问题描述 投票:0回答:4

我的查询参数之一中有一个哈希键,它可以包含 + 字符和其他特殊字符。问题是当这个 URL 被解码时 URLDecoder 将 + char 转换为空格。 有没有一种方法可以强制 URLDecoder 不将 '+' 转换为空格。

java url url-encoding urldecode
4个回答
13
投票

在解码之前对字符串执行此操作:

String plusEncoded = yourString.replaceAll("\\+", "%2b")

解码器将显示

+
它应该在的位置


7
投票

根据HTML URL编码参考

URL 不能包含空格。 URL 编码通常用加号 (+) 或 %20 替换空格。

+
符号本身必须使用
%2B
进行编码。因此,如果您想将哈希值作为 URL 中的 GET 参数传递,则应将哈希值中的加号替换为
%2B
。不要替换整个 URL 中的每个
+
,因为您可能会破坏其他假定包含空格的字符串参数。


0
投票

有一个与此问题类似的错误参考,它被关闭为“不是问题”。这里我引用受让人所说的话:

位于 https://docs.oracle.com/javase/8/docs/api/java/net/URL.html 的 Java API 文档明确指出“URLEncoder 和 URLDecoder 类也可以使用,但仅限于HTML表单编码,与RFC2396中定义的编码方案不一样。” 。这意味着它不适用于 URL 编码,并且会导致路径中出现空格和加号问题。 使用 URL 或 URI 类来构造 url 将给出预期的结果。

URL url = new URL(input);
System.out.println(url.toString()); //outputs http://www.example.com/some+thing

参考:https://bugs.openjdk.java.net/browse/JDK-8179507


0
投票

Java 的 URLDecoder 仅用于“application/x-www-form-urlencoded”。

参考:https://bugs.openjdk.org/browse/JDK-8179507#:~:text=JDK-,JDK%2D8179507,-URLDecoder%20wrongly%20replaces

位于 https://docs.oracle.com/javase/8/docs/api/java/net/URL.html 的 Java API 文档明确指出“URLEncoder 和 URLDecoder 类也可以使用,但仅限于HTML表单编码,与RFC2396中定义的编码方案不一样。” 。这意味着它不适用于 URL 编码,并且会导致路径中出现空格和加号问题。

解决方案

不要使用 Java 的 URLDecoder,而是使用任何百分比编码库。其中之一是 org.apache.commons.codec.net.PercentCodec

示例代码

PercentCodec percentCodec = new PercentCodec();
        String decodedCert = new String(percentCodec.decode("<endoded text>", "UTF-8");
© www.soinside.com 2019 - 2024. All rights reserved.