核心是确保“编码写入”和“解码读取”使用完全一致的字符集,尤其避免依赖平台默认编码;推荐统一用UTF-8,文件读写须显式指定StandardCharsets.UTF_8,禁用FileReader/FileWriter,数据库连接需在JDBC URL中声明useUnicode=true&characterEncoding=UTF-8,HTTP请求响应要设置charset,开发环境、IDE、JVM参数(-Dfile.encoding=UTF-8)须全部统一为UTF-8。

Java 中解决中文乱码问题,核心是确保“编码写入”和“解码读取”使用完全一致的字符集,尤其要避免依赖平台默认编码。UTF-8 是当前最推荐、兼容性最强的统一选择。
文件读写必须显式指定编码
Java 的 FileInputStream/FileOutputStream 只处理字节,不涉及字符;真正决定中文是否正常的是包装它的 InputStreamReader 和 OutputStreamWriter ——它们需要明确传入编码。
- 读文件时:用
new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8) - 写文件时:用
new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8) - 不要用
FileReader/FileWriter,它们隐式使用系统默认编码,极不可靠
数据库连接需在 JDBC URL 中声明编码
即使数据库本身设为 utf8mb4,若 JDBC 连接未强制指定字符集,Java 仍可能用错误编码传输中文。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- MySQL 示例连接串:
jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai - 务必包含
useUnicode=true和characterEncoding=UTF-8,缺一不可 - HikariCP 等连接池也需在
dataSourceProperties中配置相同参数
HTTP 请求与响应要声明 charset
Web 场景下,乱码常出现在表单提交或 API 返回中,根源是 Content-Type 缺少 charset 声明。
立即学习“Java免费学习笔记(深入)”;
- Servlet 中设置请求编码:
request.setCharacterEncoding("UTF-8")(应在读取参数前调用) - 响应头应包含:
response.setContentType("text/html; charset=UTF-8") - Spring Boot 项目可在
application.properties中全局配置:server.servlet.encoding.charset=UTF-8和server.servlet.encoding.force=true
开发环境与 JVM 层面要统一基础设定
IDE、源文件保存格式、JVM 启动参数三者不一致,会让问题变得隐蔽且难以复现。
- IDEA 或 Eclipse:将项目编码、文件编码、控制台编码全部设为 UTF-8
- .java 源文件本身必须以 UTF-8 格式保存(注意 BOM 问题,一般不加 BOM)
- -Dfile.encoding=UTF-8,可避免某些底层 API(如
new Scanner(System.in))误用系统默认编码

















