乱码本质是字符编码不一致(如源文件用UTF-8保存,但编译/运行时用系统默认编码(如GBK)解析)。以下是针对性解决步骤:
首先检查当前Ubuntu系统的区域设置,确保编码为UTF-8:
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使配置生效。若源文件是用UTF-8保存的(推荐),编译时需通过-encoding参数明确告诉javac使用UTF-8解析:
javac -encoding UTF-8 YourProgram.java
若源文件是用其他编码(如GBK,常见于Windows迁移的代码)保存的,需将UTF-8替换为对应的编码(如GBK)。
运行程序时,通过-Dfile.encoding参数指定JVM的默认编码为UTF-8,确保程序输出和字符串处理正确:
java -Dfile.encoding=UTF-8 YourProgram
若程序中涉及文件读写、网络传输等场景,也建议在代码中显式设置编码(见步骤5)。
若Java GUI程序(如Swing、AWT)显示中文为方框或乱码,需安装中文字体并配置字体缓存:
sudo apt update
sudo apt install ttf-wqy-microhei ttf-wqy-zenhei ttf-simsun
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
sudo mkfontscale
sudo mkfontdir
sudo fc-cache -fv
重启Java程序即可生效。在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"));
若使用编辑器(如VS Code、IntelliJ IDEA)或IDE编写Java代码,需确保文件保存编码为UTF-8:
GBK),选择“保存为UTF-8”;File → Settings → Editor → File Encodings,将“Global Encoding”和“Project Encoding”设置为UTF-8。通过以上步骤,可覆盖Java编译、运行、GUI显示等场景的乱码问题。需根据实际情况组合使用(如系统编码+编译参数+运行参数+字体配置)。