我的查询参数之一中有一个哈希键,它可以包含 + 字符和其他特殊字符。问题是当这个 URL 被解码时 URLDecoder 将 + char 转换为空格。 有没有一种方法可以强制 URLDecoder 不将 '+' 转换为空格。
在解码之前对字符串执行此操作:
String plusEncoded = yourString.replaceAll("\\+", "%2b")
解码器将显示
+
它应该在的位置
根据HTML URL编码参考:
URL 不能包含空格。 URL 编码通常用加号 (+) 或 %20 替换空格。
和
+
符号本身必须使用 %2B
进行编码。因此,如果您想将哈希值作为 URL 中的 GET 参数传递,则应将哈希值中的加号替换为 %2B
。不要替换整个 URL 中的每个 +
,因为您可能会破坏其他假定包含空格的字符串参数。
有一个与此问题类似的错误参考,它被关闭为“不是问题”。这里我引用受让人所说的话:
位于 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
Java 的 URLDecoder 仅用于“application/x-www-form-urlencoded”。
位于 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");