在 CentOS 上用 javac 编译 Java 出现乱码,通常不是 Java 本身的问题,而是字符编码不一致导致的。下面按“原因 → 场景 → 解决办法”来说明。
javac 用系统默认编码(如 GBK)CentOS 默认 locale 可能是:
LANG=zh_CN.UTF-8
或
LANG=C
如果终端或文件编码不匹配,javac 就会:
✅ 解决方式(强烈推荐):
javac -encoding UTF-8 Hello.java
查看:
locale
如果看到:
LANG=C
LC_CTYPE="C"
说明系统用的是 ASCII,Java 中文一定会乱。
✅ 解决:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
或永久修改:
vim /etc/locale.conf
LANG=zh_CN.UTF-8
现象:
✅ 解决:
javac -encoding GBK Hello.java
或转码:
iconv -f GBK -t UTF-8 Hello.java > Hello_utf8.java
比如:
如果终端编码是 GBK,而系统是 UTF-8,也会“看起来像乱码”。
✅ 解决:
如果是:
java Hello
输出乱码,但编译没问题:
✅ 运行也指定编码:
java -Dfile.encoding=UTF-8 Hello
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
CentOS 上 Java 编译乱码,99% 是“文件编码 ≠ javac 编码 ≠ 系统 locale”
✅ 通用最佳实践:
# 系统
LANG=zh_CN.UTF-8
# 编译
javac -encoding UTF-8 Xxx.java
# 运行
java -Dfile.encoding=UTF-8 Xxx
如果你愿意,可以把:
localefile Hello.java贴出来,我可以精确告诉你哪一步出了问题。