tomcat中文乱码问题主要通过配置server.xml的uriencoding="utf-8"解决get乱码,配合页面及过滤器统一设置post请求编码,确保前后端字符集对齐。

直接改 server.xml 里的 URIEncoding="UTF-8",再配好页面 <meta charset="UTF-8">,90% 的中文乱码问题就没了。其他“手动转码”“反复设 encoding”都是绕远路,还容易漏环节。
Tomcat GET 请求中文变 ??? 怎么办
浏览器把中文 你好 编成 %E4%BD%A0%E5%A5%BD 发过去,但 Tomcat 默认用 ISO-8859-1 去解这串字节,结果就是乱码。这不是你代码写错了,是服务器配置没对齐。
- 必须改
$CATALINA_HOME/conf/server.xml中的<connector></connector>标签,加URIEncoding="UTF-8"(注意:只能是UTF-8,utf8或UTF8都无效) - 改完必须重启 Tomcat,热加载不生效
-
request.setCharacterEncoding("UTF-8")对 GET 参数完全无效——它只管 POST body,不管 URL 查询字符串 - Spring Boot 内嵌 Tomcat 要配
server.tomcat.uri-encoding=UTF-8,不是spring.http.encoding
POST 提交后中文还是乱码?检查这三处
POST 乱码通常不是单点问题,而是前端、容器、读取顺序三者没卡准。
- HTML 页面必须有
<meta charset="UTF-8">,且放在最前面(前 1024 字节内),避免 BOM 干扰(VS Code 默认可能存成 “UTF-8 with BOM”,要关掉) -
request.setCharacterEncoding("UTF-8")必须在第一次调用getParameter()之前执行;如果已调过getInputStream()或getReader(),再设就晚了 - 推荐用 Filter 统一处理:
if ("POST".equalsIgnoreCase(request.getMethod())) { request.setCharacterEncoding("UTF-8"); },比在每个 Servlet 里重复写更可靠 - Spring MVC 的
CharacterEncodingFilter要确保forceEncoding=true,否则只在没指定编码时才生效
移动端表单提交乱码特别难搞?盯死这三个地方
iOS Safari 和 Android WebView 对 accept-charset 支持极差,基本靠 fallback,所以不能依赖它。
-
<form accept-charset="UTF-8"></form>在 iOS Safari 中完全被忽略,它只看页面本身的<meta charset>;Android 某些定制 ROM(如旧版 MIUI)甚至 fallback 到 GBK - 检查响应头:用 Chrome DevTools 的 Network 面板看 HTML 响应的
Content-Type是否含charset=UTF-8;Nginx/Apache 如果配了charset gbk,会直接覆盖<meta> - FormData +
fetch()是安全的,默认 UTF-8;但手拼URLSearchParams或new Blob()时,别假设浏览器一定按 UTF-8 处理——尤其老 Android WebView 可能用 Latin-1 解码 Blob
最常被跳过的其实是 HTML 文件本身的保存编码和 BOM。哪怕写了 <meta charset="UTF-8">,如果文件实际是 GBK 存的,或者开头有 BOM(ef bb bf),浏览器照样会误判。用 head -c 3 index.html | xxd 看前三字节,是最直接的验证方式。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











