为什么Java URLEncoder返回的编码值与预期不一致
问题原因
java.net.URLEncoder 默认实现的是 application/x-www-form-urlencoded 编码规范,该规范明确要求空格需编码为 +,你预期的 %20 是 RFC 3986 编码规范对空格的处理规则,二者适用场景不同。
你代码中替换 ' 为 ' 的逻辑是正确的,单引号编码得到 %27 也符合预期,偏差仅来自空格的编码规则差异。
修复方案
通用兼容方案(适配所有Java版本)
编码完成后手动替换 + 为 %20 即可,该操作是安全的:原始内容中的 + 会被 URLEncoder 编码为 %2B,不会和代表空格的 + 混淆。
lastName = URLEncoder.encode(lastName.replace("'", "'"), "UTF-8") .replace("+", "%20");
Java 11+ 原生方案
你也可以直接使用 java.net.URI 类实现 RFC 3986 规范的编码,无需手动替换:
String rawLastName = lastName.replace("'", "'"); // 构造仅携带查询参数的URI对象提取编码结果 String encodedLastName = new URI(null, null, null, -1, null, "k=" + rawLastName, null) .toASCIIString() .substring(3); // 去掉前缀"?k="得到编码后的参数值
内容的提问来源于stack exchange,提问作者challengeAccepted
相关产品推荐
相关产品推荐

