Java中文乱码本质是编码链路中某环节字符集不匹配,导致字节被错误解读;解决关键在于全程显式控制UTF-8,覆盖源文件保存、IDE设置、编译参数、文件读写、JDBC连接、数据库配置及控制台输出等所有环节。

Java 中的乱码问题,本质是编码链路中某一处用了错的字符集,导致字节被错误解读。解决的关键不是“试”,而是“控”——控制每个环节明确使用 UTF-8(推荐),并确保读写两端严格一致。
源文件与编译器编码要对齐
IDE 默认编码和实际文件保存编码不一致,是编译阶段就埋下的乱码隐患。
- IntelliJ IDEA:进入 File → Settings → Editor → File Encodings,将 Global Encoding、Project Encoding 和 Default encoding for properties files 全部设为 UTF-8
- Eclipse:打开 Window → Preferences → General → Workspace,把 Text file encoding 改为 UTF-8
- 命令行编译时显式指定:javac -encoding UTF-8 MyTest.java
文件读写必须显式声明编码
别依赖系统默认(Windows 常是 GBK,Linux 常是 UTF-8),FileReader/FileWriter 不支持传编码参数,务必用 InputStreamReader/OutputStreamWriter 包装。
- 安全读取:
new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"), StandardCharsets.UTF_8)) - 安全写入:
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"), StandardCharsets.UTF_8)) - 用 try-with-resources 自动关闭,避免资源泄漏
JDBC 连接和数据库本身都要 UTF-8
只改 Java 端没用,MySQL 或 Oracle 若存的是 GBK 编码数据,再怎么转也救不回。
立即学习“Java免费学习笔记(深入)”;
- 连接 URL 加参数:jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
- 确认 MySQL 实例级编码:
SHOW VARIABLES LIKE 'character_set%';,重点看 character_set_server 和 collation_server 是否为 utf8mb4 - 建表时显式指定:
CREATE TABLE t (c VARCHAR(100)) CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
控制台输出乱码?终端和 JVM 都得调
System.out.println 打印中文变问号或方块,常见于 Windows CMD 或旧版终端。
- 启动 JVM 时加参数:java -Dfile.encoding=UTF-8 MyApp
- Windows CMD 下临时切 UTF-8:
chcp 65001(执行后再运行 Java) - 更稳妥:不用 System.out 直接输出,改用带编码的 PrintWriter:
new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8))


















