java中文乱码本质是源文件编码、编译器读取编码、jvm运行时编码三者不一致:编译乱码需用javac -encoding utf-8 hello.java指定输入编码;运行乱码需用java -dfile.encoding=utf-8 hello统一jvm输出编码,并配合终端设为utf-8(如windows执行chcp 65001)。

Java 命令行编译和运行时出现中文乱码,本质是源文件编码、编译器读取编码、JVM 运行时编码三者不一致。关键不是“加一个万能参数”,而是分场景对症加参数。
编译时乱码(javac 报错或中文注释/字符串显示异常)
默认 javac 按系统编码读源文件。Windows 中文系统通常是 GBK,而你的 .java 文件可能是 UTF-8(尤其用 VS Code、IDEA 新建的),此时需显式指定输入编码:
-
加 -encoding 参数:例如
javac -encoding UTF-8 Hello.java - 如果源文件是 GBK 编码(老记事本保存),则写
javac -encoding GBK Hello.java - 务必确保该参数在
javac后、.java文件名前,顺序不能错
运行时乱码(System.out.println 输出中文为 ? 或方块)
这通常是因为 JVM 控制台输出编码与终端(CMD/PowerShell/Terminal)当前编码不匹配:
- Windows CMD 默认是 GBK,但若你用了 UTF-8 的源码并正确编译,运行时需让 JVM 用 UTF-8 输出:
java -Dfile.encoding=UTF-8 Hello - PowerShell 默认 UTF-8,但有时仍需强制:
java -Dfile.encoding=UTF-8 Hello更稳妥 - Linux/macOS 终端多为 UTF-8,一般不用加;但如果终端 locale 不是 UTF-8(如 LANG=C),也要加
-Dfile.encoding=UTF-8
终极建议:统一用 UTF-8,一劳永逸
避免来回切换编码,推荐全程使用 UTF-8:
- 编辑器保存为 UTF-8(无 BOM)
- 编译时明确指定:
javac -encoding UTF-8 Hello.java - 运行时强制编码:
java -Dfile.encoding=UTF-8 Hello - Windows 用户可临时把 CMD 切到 UTF-8:
chcp 65001(执行 java 命令前运行一次)
额外注意点
某些 IDE(如 IntelliJ)的终端模拟器有自己的编码设置,和系统 CMD 独立;命令行问题要脱离 IDE 直接在系统终端复现再调试。另外,-Dfile.encoding 影响 String.getBytes()、FileReader 等,默认字符集,但它不能修复编译阶段编码错误——编译乱码必须靠 -encoding。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











