Java中文乱码本质是编码错配,需逐环节比对:文件读写要确认保存与读取编码一致;Web请求须统一HTML、容器URI、Servlet参数三处UTF-8;数据库需贯穿JDBC连接、库、表、字段四级utf8mb4;控制台日志则依赖JVM参数-Dfile.encoding=UTF-8及终端locale设置。

Java 中乱码问题的经典案例复盘,核心不是罗列错误,而是还原“编码错配”的完整链路:从数据源头、传输路径到最终呈现,逐环节比对字符集是否一致。下面按真实开发中高频出问题的四个典型场景,给出可落地的复盘方法。
一、文件读写乱码:先查保存编码,再核读取方式
常见现象:IDE里显示正常,运行后输出“???”或“浣犲ソ”;日志文件中文变问号。
- 第一步,确认文件真实编码:不要依赖文件扩展名或IDE默认识别。用命令行工具验证——Linux/macOS 执行 file -i filename.txt,Windows 可用 VS Code 打开后右下角查看当前编码(注意不是“保存为”菜单里的选项)
- 第二步,检查 Java 读取代码是否绕过了编码声明:避免直接使用 FileReader(它强制用平台默认编码),改用 InputStreamReader + FileInputStream 并显式传入 StandardCharsets.UTF_8
- 第三步,反向验证:若已乱码,尝试用原始编码重新解码字节。例如原文件是 GBK 写入但被 UTF-8 读取,可先用 new String(bytes, "GBK") 恢复原文,再转存为 UTF-8
二、Web 请求参数乱码:盯住请求头、容器配置、代码三处
常见现象:表单提交中文,后端 request.getParameter("name") 返回乱码;URL 路径含中文时 400 错误或参数截断。
- 浏览器端:检查 HTML 页面是否有 ,且 form 的 accept-charset="UTF-8"
- 服务端:Servlet 中必须在读取参数前调用 request.setCharacterEncoding("UTF-8")(仅对 POST 有效);GET 参数需在 Tomcat 的 server.xml 中为 Connector 添加 URIEncoding="UTF-8"
- 响应端:设置 response.setContentType("text/html;charset=UTF-8"),并调用 response.setCharacterEncoding("UTF-8")
三、数据库中文乱码:字符集要贯穿连接、库、表、字段四级
常见现象:MySQL 查询结果中文正常,但 Java ResultSet 取出来是乱码;或插入中文后查出是问号。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
- 检查 MySQL 服务层:执行 SHOW VARIABLES LIKE 'character_set%',确保 character_set_server 和 collation_server 是 utf8mb4
- 检查数据库与表:建库时加 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;已有库可用 ALTER DATABASE ... CHARACTER SET 修改
- 检查 JDBC 连接串:必须包含 useUnicode=true&characterEncoding=utf8mb4(注意是 utf8mb4,不是 utf8);推荐加上 serverTimezone=Asia/Shanghai 避免时区干扰
四、控制台/日志乱码:别只怪 IDE,先看 JVM 和终端本身
常见现象:IntelliJ 控制台中文正常,但 jar 包双击运行或 Linux 终端下全是方块;Log4j 日志文件中文乱码。
- JVM 启动参数加 -Dfile.encoding=UTF-8,这是最直接有效的全局干预
- IDE 运行配置里检查 “Override default encoding” 是否勾选并设为 UTF-8(IntelliJ 在 Run → Edit Configurations → Environment Variables)
- Linux 终端执行 locale 查看当前语言环境,确保 LANG 和 LC_ALL 包含 UTF-8;必要时在启动脚本开头加 export LANG=en_US.UTF-8
- Log4j2 配置中,FileAppender 的 fileName 后加 append="true" encoding="UTF-8"
复盘的关键动作是:每遇到一次乱码,就画一条数据流线,标出每个环节使用的字符集。只要有一环不匹配,就是根因。不需要背方案,只需养成“编码必显式声明”的习惯——写文件、读请求、连数据库、打日志,全都要带 UTF-8 或 utf8mb4。

















