tomcat乱码问题需同时配置server.xml的uriencoding="utf-8"和logging.properties的consolehandler.encoding=gbk;前者解决get参数乱码,后者修复控制台日志显示,二者缺一不可,且修改后必须重启tomcat。

Tomcat 启动后控制台乱码、中文请求参数变成问号或方块——根本原因不是没配 CATALINA_HOME,而是字符集配置分散在两个地方,且作用对象不同:一个管 HTTP 请求解码(URIEncoding),一个管日志输出编码(logging.properties)。只改一个,问题照旧。
server.xml 中的 URIEncoding="UTF-8" 是必须加的
这个配置决定 Tomcat 如何解析 URL 和 GET 请求里的中文参数。不加的话,request.getParameter("name") 拿到的就是乱码,哪怕页面本身显示正常。
- 路径:
conf/server.xml,找到类似这一行:<connector port="8080" protocol="HTTP/1.1" connectiontimeout="20000" redirectport="8443"></connector> - 在该标签末尾插入
URIEncoding="UTF-8",变成:<connector port="8080" protocol="HTTP/1.1" connectiontimeout="20000" redirectport="8443" uriencoding="UTF-8"></connector> - 注意:不是
URLCoding或URLEncoding,拼写错误会导致配置被忽略 - 改完必须重启 Tomcat,热加载不生效
logging.properties 里要改 encoding=GBK(Windows)
Windows 控制台默认用 GBK 编码,而 Tomcat 日志组件默认用 UTF-8 输出,两者不匹配就满屏“???”。这不是 bug,是编码策略冲突。
- 路径:
conf/logging.properties - 找到这行:
java.util.logging.ConsoleHandler.encoding = UTF-8 - 改成:
java.util.logging.ConsoleHandler.encoding = GBK - 如果还看到其他
.encoding = UTF-8(比如java.util.logging.FileHandler.encoding),按需一并改掉 - Linux/macOS 用户不用改这里,终端通常原生支持 UTF-8
别碰系统 locale 或 cmd 默认代码页
有人试图通过 chcp 65001 切换 CMD 到 UTF-8,或修改注册表改系统 locale——这会影响所有 Java 程序,且容易引发其他工具异常。Tomcat 的乱码是它自己组件的编码行为,应由它自己的配置解决,而不是动系统底层。
-
startup.bat启动时不会继承chcp设置,改了也白改 - 某些 JDK 版本(如 8u291+)对
chcp 65001支持不稳定,反而导致System.out输出中断 - 真正需要统一编码的地方只有两处:
server.xml和logging.properties,其余都是干扰项
最常被忽略的是:改完 server.xml 后没重启,或者以为改了日志编码就能解决请求参数乱码——其实那是两个独立通道。一个管进来的数据,一个管打出来的字。漏掉任何一个,都会让你在调试时反复怀疑是不是代码写错了。











