在 CentOS 上用 Java 编译或运行 出现乱码,通常是 系统编码、终端编码、Java 编码不一致 导致的。可以按下面步骤逐一排查和解决。
locale
正常应是:
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8
如果不是 UTF-8,先设置:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
(永久生效可写入 /etc/profile 或 ~/.bashrc)
locale -a | grep zh_CN
如果没有,安装:
yum install -y glibc-common
localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8
javac -encoding UTF-8 Hello.java
如果源码是 GBK:
javac -encoding GBK Hello.java
✅ 推荐:永远用 UTF-8 写代码 + 编译时指定 UTF-8
运行也指定编码:
java -Dfile.encoding=UTF-8 Hello
如果你用:
确保:
否则即使 Java 正常,也会显示乱码。
如果是 Web 项目:
export JAVA_OPTS="-Dfile.encoding=UTF-8"
或在 catalina.sh 中加:
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
export MAVEN_OPTS="-Dfile.encoding=UTF-8"
或在 pom.xml:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
| 检查项 | 命令 |
|---|---|
| 系统编码 | locale |
| 编译编码 | javac -encoding UTF-8 |
| 运行编码 | java -Dfile.encoding=UTF-8 |
| 文件编码 | file xxx.java |
| 终端编码 | SSH 客户端设置 |
❌ 文件是 UTF-8,但没加 -encoding
❌ CentOS 默认 en_US 导致中文乱码
❌ Windows 写代码用 GBK,Linux 用 UTF-8
❌ 只改运行没改编译
如果你愿意,可以把:
locale 输出javac 命令
发出来,我可以帮你精确定位是哪一步乱码。