在 Ubuntu 下 Java 出现乱码,通常是字符编码不一致导致的(Java 默认编码、终端编码、文件编码、系统 locale 不一致)。下面按常见场景给你一套处理方案。
locale
如果不是 UTF-8,建议改成 UTF-8:
sudo apt install locales
sudo locale-gen zh_CN.UTF-8
sudo update-locale LANG=zh_CN.UTF-8
或者直接用:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
(推荐 UTF-8,不一定非要是中文)
java -XshowSettings:properties -version 2>&1 | grep encoding
或:
java -Dfile.encoding=UTF-8 YourMainClass
如果看到不是 UTF-8(比如 ANSI_X3.4-1968),就会乱码。
java -Dfile.encoding=UTF-8 -jar app.jar
-Dfile.encoding=UTF-8
不要依赖默认编码
new InputStreamReader(
new FileInputStream("a.txt"),
StandardCharsets.UTF_8
)
new OutputStreamWriter(
new FileOutputStream("b.txt"),
StandardCharsets.UTF_8
)
new String(bytes, StandardCharsets.UTF_8);
如果你是在 终端或 SSH 里看到乱码:
echo $LANG
<encoder>
<pattern>%d %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
-Dfile.encoding=UTF-8
| 问题 | 解决 |
|---|---|
| 控制台中文乱码 | -Dfile.encoding=UTF-8 |
| 文件读写乱码 | 指定 UTF-8 |
| 打包后乱码 | 编译时加 -encoding UTF-8 |
| Docker 里乱码 | 镜像里装 locales |
| 服务器无中文字体 | 安装 fonts-wqy-zenhei |
javac -encoding UTF-8 *.java
如果你能告诉我:
我可以给你更精确的一行命令方案。