Java中URL编码解码需用URLEncoder.encode()和URLDecoder.decode()并指定UTF-8字符集,否则易乱码;编码将非ASCII字符转%xx、空格变+,解码需匹配相同编码,Web中注意Servlet容器默认ISO-8859-1解码陷阱。

Java里对字符串做URL编码和解码,核心就是用 URLEncoder.encode() 和 URLDecoder.decode() 这两个静态方法,但必须指定字符集(推荐 UTF-8),否则容易出乱码。
编码:用 URLEncoder.encode() 转成安全格式
URL 编码不是简单替换符号,而是把非 ASCII 字符按 UTF-8 字节序列转成 %xx 形式,同时空格变 +,字母数字和 . - _ * 等保留不编。
- 必须传入编码名,比如
URLEncoder.encode("你好", "UTF-8")→%E4%BD%A0%E5%A5%BD - 不要用已废弃的单参数方法
encode(String s),它依赖系统默认编码,跨平台结果不可控 - 像
/、?、=、&这些在 URL 中有语法意义的字符,如果出现在参数值里(比如作为搜索词),也得编码,否则会破坏 URL 结构
解码:用 URLDecoder.decode() 恢复原始字符串
解码是编码的逆过程,但前提是使用和编码时完全相同的字符集,否则中文会变问号或方块。
- 写法如
URLDecoder.decode("%E4%BD%A0%E5%A5%BD", "UTF-8")→你好 - 注意:+ 号会被自动还原为空格,而 %2B 才是加号本身;所以原始字符串含 + 时,它会被编码成 %2B,解码后才恢复为 +
- 如果编码时用了 UTF-8,解码时却用 ISO-8859-1,结果基本是乱码,这点在 Web 请求中特别容易踩坑
Web 场景常见陷阱:request.getParameter() 自动解码一次
Servlet 容器收到请求后,对 query string 或表单数据会默认用 ISO-8859-1 解一次码,再交给你的代码。这会导致你手动 decode 出错。
立即学习“Java免费学习笔记(深入)”;
- 例如前端传
name=%E4%BD%A0%E5%A5%BD,容器先按 ISO-8859-1 解成乱码字节,你再用 UTF-8 decode 就失败 - 正确做法:要么统一设置 request.setCharacterEncoding("UTF-8"),要么前端用两次 encode(不推荐),或者改用 POST + JSON 避开 form 编码逻辑
- 调试时可用
request.getQueryString()看原始未处理字符串,确认是否被提前解码
实际代码示例(带异常处理)
下面这段能直接运行,体现标准用法:
try {
String original = "张三 & 李四/测试+参数";
String encoded = URLEncoder.encode(original, "UTF-8"); // → %E5%BC%A0%E4%B8%89+%26+%E6%9D%8E%E5%9B%9B%2F%E6%B5%8B%E8%AF%95%2B%E5%8F%82%E6%95%B0
String decoded = URLDecoder.decode(encoded, "UTF-8");
System.out.println(decoded); // 输出:张三 & 李四/测试+参数
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}


















