在 CentOS 中 Java 编译出现乱码,通常是系统字符集、文件编码、javac 编码参数不一致导致的。下面按常见场景一步步处理。
locale
echo $LANG
如果看到:
LANG=
LC_ALL=
或不是 UTF-8,就容易乱码。
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
永久生效(CentOS 7):
localectl set-locale LANG=zh_CN.UTF-8
CentOS 6:
vi /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"
file -i Hello.java
如果源文件是 GBK,但系统/编译器按 UTF-8 处理,就会乱码。
javac -encoding UTF-8 Hello.java
如果是 GBK 文件:
javac -encoding GBK Hello.java
✅ 强烈建议统一使用 UTF-8
java -Dfile.encoding=UTF-8 Hello
否则即使编译正常,运行时也可能乱码。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
-encoding UTF-8| 场景 | 原因 | 解决 |
|---|---|---|
| 编译报错乱码 | 系统非 UTF-8 | 设置 LANG |
| 注释乱码 | 文件编码不一致 | javac -encoding |
| 运行时输出乱码 | file.encoding 不对 | -Dfile.encoding=UTF-8 |
| 日志乱码 | 控制台编码不对 | 终端 UTF-8 |
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
javac -encoding UTF-8 *.java
java -Dfile.encoding=UTF-8 Main
如果你愿意,可以把:
locale 输出file -i 文件名发出来,我可以帮你精准定位是哪一层编码出问题。