java中url编码解码应使用urlencoder.encode(value,"utf-8")编码参数值、urldecoder.decode(encodedvalue,"utf-8")解码,二者仅适用于查询参数,不适用完整url;推荐java 15+用uri类分段构造以确保rfc 3986合规。

Java 中 URL 编码和解码主要通过 java.net.URLEncoder 和 java.net.URLDecoder 实现,但要注意它们只处理查询参数部分(即 ?key=value 中的 value),不适用于整个 URL 字符串。从 Java 15 开始,推荐使用更安全、更标准的 java.net.URI 构造方式来避免手动编码错误。
URL 编码:用 URLEncoder.encode() 处理参数值
URLEncoder.encode() 将字符串按指定字符集(必须显式传入,如 UTF-8)转换为 %xx 形式的 ASCII 字符序列,空格变成 +(不是 %20),这是 application/x-www-form-urlencoded 格式的要求。
- 只对参数值编码,不要对整个 URL 调用它(比如
https://a.b/c?x=...的x=...部分才需编码) - 必须指定字符集,否则使用平台默认编码(容易出错),Java 10+ 已废弃无字符集参数的重载方法
- 示例:
URLEncoder.encode("张三&test", "UTF-8")→%E5%BC%A0%E4%B8%89%26test
URL 解码:用 URLDecoder.decode() 还原参数值
URLDecoder.decode() 是 encode() 的逆操作,把 %xx 和 +(代表空格)还原为原始字符。同样必须指定字符集,且要与编码时一致。
- 如果编码时用了 UTF-8,解码也必须用 UTF-8,否则中文会乱码
- 注意:它会把
+当作空格处理,所以仅适用于表单提交格式;若 URL 路径中本就有+,不能直接用它解码路径部分 - 示例:
URLDecoder.decode("%E5%BC%A0%E4%B8%89%26test", "UTF-8")→"张三&test"
更健壮的方式:用 URI 类构造完整 URL
手动拼接并编码容易遗漏或重复编码。推荐用 URI 构造器,它内部自动对各组成部分(scheme、host、path、query 等)做合规编码:
- 创建
URI对象时传入各段原始字符串,它会按 RFC 3986 规则分别编码 - 例如:
new URI("https", "example.com", "/api/user", "name=" + URLEncoder.encode("王五", "UTF-8"), null) - 调用
uri.toString()得到完全合法的 URL 字符串,无需再手工拼接或二次编码
常见误区和注意事项
很多问题源于混淆了“URL 编码”和“URI 编码”的适用范围:
-
URLEncoder/URLDecoder是为 HTML 表单设计的,对应application/x-www-form-urlencoded,不是通用 URI 编码工具 - 路径中的斜杠
/、冒号:、@ 等在 URI 中有特殊含义,URLEncoder会错误地把它们也编码,导致 URL 失效 - 现代开发中,建议优先使用
java.net.http.HttpClient配合URIBuilder(如 Apache HttpClient)或 Spring 的UriComponentsBuilder来构建带参 URL
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











