Debian上Tomcat乱码排查与修复
一、先定位乱码来源
catalina.out 启动日志);2) 访问日志/应用日志;3) HTTP请求参数或页面显示。locale,推荐为 zh_CN.UTF-8 或 en_US.UTF-8。echo $LANG $LC_CTYPE。catalina.out 与 localhost.*.log 是否中文正常。curl -v 或浏览器开发者工具查看响应头 Content-Type 是否包含 charset=UTF-8。二、系统层设置
sudo dpkg-reconfigure locales,勾选 zh_CN.UTF-8(或 en_US.UTF-8)。export LANG=zh_CN.UTF-8(或 en_US.UTF-8);永久生效写入 /etc/default/locale 或 /etc/profile:
echo 'LANG=zh_CN.UTF-8' | sudo tee /etc/default/localelocale。三、Tomcat层设置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
if [ -z "$LOGGING_MANAGER" ]; then 分支内追加:LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
java.util.logging.ConsoleHandler.encoding 设为 UTF-8;1catalina.org.apache.juli.AsyncFileHandler.encoding 等文件日志的 encoding 设为 UTF-8。<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>setCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
request.setCharacterEncoding("UTF-8")(在读取参数前调用);<%@ page contentType="text/html; charset=UTF-8" %>;<meta charset="UTF-8">。四、重启与验证
sudo systemctl restart tomcat9(或 tomcat);./bin/catalina.sh run(便于直接观察控制台输出)。catalina.out 与 localhost.*.log 中文正常;<meta charset="UTF-8"> 与响应头一致;五、常见坑与建议
URIEncoding 不足以解决所有问题,需同时设置 JVM 默认编码 与 日志编码。catalina.out 的错误线索。curl -H "Accept-Charset: UTF-8" -v http://localhost:8080/your-app 辅助排查响应头与内容编码。