在 Debian 上运行 Java 程序出现乱码,绝大多数情况不是 Java 本身的 bug,而是字符编码环境不一致导致的。下面按「原因 → 排查 → 解决」来说明。
Debian 默认可能是:
LANG=C
LC_ALL=C
C 环境使用 ASCII,中文必乱码。
检查:
locale
如果看到:
LANG=C
LC_CTYPE="C"
那就是原因。
✅ 解决:
sudo dpkg-reconfigure locales
# 至少选 en_US.UTF-8 或 zh_CN.UTF-8
sudo update-locale LANG=zh_CN.UTF-8
重新登录或重启。
Java 默认编码来自系统 locale。
查看 Java 编码:
java -XshowSettings:properties -version 2>&1 | grep encoding
如果看到:
file.encoding = ANSI_X3.4-1968
说明 Java 在用 ASCII。
✅ 解决方式(任选):
方式 A:启动参数指定
java -Dfile.encoding=UTF-8 -jar app.jar
方式 B:环境变量
export JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8"
即使系统是对的,终端错了也会乱码。
检查:
echo $LANG
SSH 客户端(如 PuTTY、Xshell、SecureCRT)要设置为:
比如:
.java / .txt 是 GBK检查:
file 文件名
转换:
iconv -f GBK -t UTF-8 in.txt > out.txt
Java 中读取时指定:
new InputStreamReader(inputStream, "GBK")
例如:
解决:
java -Dfile.encoding=UTF-8 ...
并用 UTF‑8 打开日志文件。
locale
echo $LANG
java -XshowSettings:properties -version 2>&1 | grep encoding
file 你的文件
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8
JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8"
| 场景 | 原因 |
|---|---|
| 控制台中文乱码 | locale 不是 UTF‑8 |
| 文件读写乱码 | 文件编码不一致 |
| 日志乱码 | Java 编码 ≠ 终端 |
| Docker 中乱码 | 没设 LANG |
如果你愿意,可以告诉我:
java -version)我可以直接给你精准改法。