Java中对URL中文参数转义应使用URLEncoder.encode(str, "UTF-8")仅编码参数值,避免编码整个URL;空格可替换为%20;服务端request.getParameter()自动解码,无需手动URLDecoder.decode()。

Java 中对 URL 中的中文参数进行转义,核心是使用 URLEncoder.encode() 方法,确保中文以 UTF-8 编码后变成合法的 URL 字符序列(如 %E4%BD%A0),避免传输乱码或解析失败。
用 URLEncoder.encode() 正确编码中文参数
这是最标准、最推荐的方式。必须指定字符集为 UTF-8,否则默认平台编码(如 GBK)会导致服务端解码不一致。
- 编码单个参数值:直接对参数值调用
URLEncoder.encode(str, "UTF-8") - 空格会被编码为
+,但很多服务端(尤其是 Spring MVC)能自动识别并还原;若需统一为%20,可额外替换:.replaceAll("\+", "%20") - 不要对整个 URL 调用 encode —— 只编码参数值本身,例如:
"https://api.example.com/search?keyword=" + URLEncoder.encode("北京天气", "UTF-8")
拼接 URL 时注意保留原始结构
URL 的协议、域名、路径等部分不能编码,仅对查询参数(?key=value 中的 value)或片段(# 后内容)单独编码。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 错误做法:
URLEncoder.encode("https://a.com?q=你好", "UTF-8")→ 破坏协议和分隔符 - 正确做法:只编码参数值,再拼入已知结构的 URL 中
- 多个参数要分别编码:
String url = base + "?name=" + URLEncoder.encode(name, "UTF-8") + "&city=" + URLEncoder.encode(city, "UTF-8");
服务端接收时无需额外 decode
在标准 Servlet 容器(Tomcat、Jetty 等)中,只要请求头 Content-Type 正确且容器配置合理,request.getParameter("xxx") 会自动完成一次 UTF-8 解码。
立即学习“Java免费学习笔记(深入)”;
- Tomcat 用户建议在
server.xml的<Connector>中显式添加:URIEncoding="UTF-8"(不是GBK或ISO-8859-1) - 如果前端做了两次 encode(如 JS 中
encodeURIComponent(encodeURIComponent(...))),服务端也只需一次getParameter即可还原,无需手动URLDecoder.decode() - 仅在特殊场景(如从请求体 raw data 手动读取参数字符串)才需调用
URLDecoder.decode(str, "UTF-8")
避开常见陷阱
有些写法看似可行,实则隐患大:
- 不用
new String(bytes, "ISO-8859-1")强转解码 —— 这是旧式“兼容性补救”,易丢字节、出乱码 - 不依赖浏览器自动编码(如直接写
location.href = "a?x=你好")—— 不同浏览器行为不一,且?后非 ASCII 字符未定义 - 不混用
encodeURI和encodeURIComponent前端 JS 编码逻辑 —— Java 后端只认URLEncoder格式

















