java中文乱码本质是字节流在源文件保存、编译读取、jvm解码、终端显示任一环节编码不一致所致;须统一全程使用utf-8,并正确配置ide、编译参数、jvm选项及终端编码。

Java 中乱码不是“显示坏了”,而是字节流在某个环节被错误解读了。核心就四件事:源文件怎么存、编译器怎么读、JVM 怎么解、终端怎么显。只要其中一环编码不一致,中文就变问号或方块。
确保 .java 源文件用 UTF-8 保存
这是起点。如果源码本身是 GBK 编码保存的,但 IDE 默认按 UTF-8 读,字符串字面量里的中文从编译那一刻起就错了。
- VS Code:右下角点击编码名称(如“GBK”),选“Save with Encoding” → “UTF-8”
- IntelliJ IDEA:File → Settings → Editor → File Encodings → 全局和项目编码都设为 UTF-8
- 记事本/Notepad++:另存为时手动选“UTF-8 无 BOM”
编译时明确指定 -encoding 参数
javac 不会自动猜源码编码。即使文件是 UTF-8,不加参数,它可能按系统默认(如 Windows 的 GBK)去解析,导致 class 文件里字符串常量已损坏。
- 命令行编译:javac -encoding UTF-8 Hello.java
- Maven 项目:在 pom.xml 的 maven-compiler-plugin 中配置
UTF-8 - Gradle 项目:在 build.gradle 中添加 compileJava.options.encoding = "UTF-8"
JVM 启动时统一 file.encoding
System.out.println 输出中文,本质是 JVM 把字符串转成字节写入 stdout 流。这个转换用的字符集,由 JVM 的 file.encoding 决定,默认值取决于操作系统,不可靠。
- 运行时加参数:java -Dfile.encoding=UTF-8 Hello
- IDE 运行配置:在 Run Configuration 的 VM options 里填入 -Dfile.encoding=UTF-8
- 不推荐代码中调用 System.setProperty("file.encoding", "UTF-8") —— 此时 JVM 已启动,部分底层逻辑(如静态初始化块)可能已按旧编码执行
终端/控制台必须支持并使用 UTF-8 解码
即使前面三步全对,终端用 GBK 去解 UTF-8 字节流,照样乱码。这不是 Java 的问题,是终端的解码行为。
- Windows CMD:运行 chcp 65001(临时切换),或在属性 → 选项 → 当前代码页改为 65001
- Windows Terminal / PowerShell:默认支持 UTF-8,检查设置中是否启用“以 UTF-8 运行”
- macOS / Linux 终端:确保 locale 是 en_US.UTF-8 或 zh_CN.UTF-8(执行 locale 查看,有问题则 export LANG=en_US.UTF-8)
- VS Code 内置终端:默认继承系统 locale,若异常可在 settings.json 中添加 "terminal.integrated.env.linux": {"LANG": "en_US.UTF-8"} 等
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











