在 Ubuntu 系统中进行 Java 编译或运行时出现乱码,这个问题看似复杂实则简单。根本原因在于编码不一致——源文件以 UTF-8 格式保存,但编译或执行时系统却采用 GBK 解码,自然导致显示异常。下面这几个步骤,基本能覆盖所有常见场景的解决方案。

1. 确认系统字符编码是否为 UTF-8
首先检查当前 Ubuntu 的区域设置。打开终端,执行 locale 命令,查看输出中的 LANG、LC_ALL 等变量。如果这些变量没有携带 .UTF-8 后缀(例如应为 zh_CN.UTF-8 或 en_US.UTF-8),则需要手动修改。
- 临时修改(仅对当前终端生效):
export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 - 永久修改(对所有用户生效):编辑
~/.bashrc或~/.profile,在末尾添加上述两行,然后运行source ~/.bashrc使配置生效。
2. 编译 Java 源文件时指定编码
如果你习惯使用 UTF-8 保存源码(强烈推荐),编译时务必通过 -encoding 参数告知 javac 以 UTF-8 解析:
javac -encoding UTF-8 YourProgram.java
如果源码是从 Windows 环境迁移过来的,采用的是 GBK 或其他编码,则将 UTF-8 替换为对应的编码名称,例如 GBK。
3. 运行 Java 程序时设置 JVM 编码
运行阶段也可以通过参数指定 JVM 默认编码:
java -Dfile.encoding=UTF-8 YourProgram
这样能确保系统输出和字符串处理都走 UTF-8。如果程序还涉及文件读写、网络传输等操作,最好在代码中也显式设置编码(参考第5步)。
4. 安装并配置中文字体(解决 GUI 乱码)
Java 的图形界面(Swing、AWT)显示中文时出现方框或乱码?十有八九是字体问题。需要安装中文字体并配置字体缓存。
- 先安装字体,例如文泉驿微米黑、思源黑体等:
sudo apt update sudo apt install ttf-wqy-microhei ttf-wqy-zenhei ttf-simsun - 然后配置字体 fallback,让 JVM 能找到中文字体。进入 JDK 的
jre/lib/fontconfig目录,创建fallback子目录,再将字体文件链接过去(以文泉驿微米黑为例):cd $JAVA_HOME/jre/lib/fontconfig sudo mkdir fallback sudo ln -s /usr/share/fonts/truetype/wqy/wqy-microhei.ttc fallback/wqy-microhei.ttc - 最后更新字体缓存:
重启 Java 程序,乱码问题即可解决。sudo mkfontscale sudo mkfontdir sudo fc-cache -fv
5. 代码中显式设置编码(增强兼容性)
某些情况下环境变量可能未及时生效,稳妥的做法是在 Java 代码入口(例如 main 方法)中使用 System.setProperty 强制指定编码:
public class YourProgram {
public static void main(String[] args) {
System.setProperty("file.encoding", "UTF-8"); // 设置默认编码
// 其他代码...
}
}
进行文件读写时,记得使用 InputStreamReader / OutputStreamWriter 明确指定编码,切勿偷懒:
// 读取文件(UTF-8 编码)
BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream("input.txt"), "UTF-8"));
// 写入文件(UTF-8 编码)
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8"));
6. 检查编辑器/IDE 的编码设置
最后不要忽略源头——你写代码的工具。VS Code、IntelliJ IDEA 等 IDE 的默认保存编码可能不是 UTF-8。
- VS Code:观察右下角状态栏,如果显示的是
GBK等编码,点击它,选择“保存为 UTF-8”即可。 - IntelliJ IDEA:进入
File → Settings → Editor → File Encodings,将“Global Encoding”和“Project Encoding”都设为UTF-8。
以上步骤基本覆盖了编译、运行、GUI 显示各阶段的乱码问题。实际场景中可能需要组合使用——例如调整系统编码、添加编译参数、设置运行参数、再配置字体。对症下药,乱码就能彻底搞定。
