亂碼本質是字符編碼不一致(如源文件用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顯示等場景的亂碼問題。需根據實際情況組合使用(如系統編碼+編譯參數+運行參數+字體配置)。