在 Debian 上出现 Java 乱码(中文/日文等变成 ??? 或方块),通常不是“Java 本身坏了”,而是 字符编码环境不一致。下面按「原因 → 排查 → 解决」说明。
Java 默认使用系统 Locale 决定的编码。
如果 Debian 是:
LANG=C
或
LANG=POSIX
Java 会默认使用 ASCII / ISO-8859-1,中文直接乱码。
✅ 正确应该是:
LANG=zh_CN.UTF-8
# 或
LANG=en_US.UTF-8
很多最小化安装(云服务器、Docker)根本没生成 UTF-8 locale。
查看:
locale -a
如果看不到:
en_US.utf8
zh_CN.utf8
就是没装。
即使系统是 UTF-8,有些程序仍会乱码:
java -Dfile.encoding=UTF-8 -jar app.jar
locale
乱码典型输出:
LANG=C
LC_ALL=
java -XshowSettings:properties -version 2>&1 | grep encoding
或:
System.out.println(System.getProperty("file.encoding"));
sudo apt update
sudo apt install locales
sudo dpkg-reconfigure locales
勾选:
en_US.UTF-8
zh_CN.UTF-8
然后:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
(写入 ~/.bashrc 或 /etc/environment)
java -Dfile.encoding=UTF-8 -jar app.jar
或在代码里:
System.setProperty("file.encoding", "UTF-8");
Docker 常见乱码,必须加:
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
不要改系统,而是:
new InputStreamReader(
new FileInputStream(file),
StandardCharsets.GBK
);
CATALINA_OPTS="-Dfile.encoding=UTF-8"
Debian Java 乱码 = 系统不是 UTF-8 + Java 没指定编码
✅ 装 UTF-8 Locale
✅ 设 LANG=*.UTF-8
✅ Java 加 -Dfile.encoding=UTF-8
如果你愿意,可以贴:
locale 输出我可以给你精确命令。