這個問題主要是因為 JVM 預設使用系統的檔案編碼(在你的情況下是 ASCII/ISO-8859),而你的 Java 程式和來源碼是以 UTF-8 編碼所撰寫,導致在處理中文字串(例如「工作日誌」)時出現亂碼。
解決方法有兩種:
強制 JVM 使用 UTF-8 編碼:
在執行 Java 程式時,加上參數 -Dfile.encoding=UTF-8
,例如:
app=$(basename $0)
workday=$(date +%Y%m%d)
java -Dfile.encoding=UTF-8 Worklog $app $workday "工作日誌"
這樣 JVM 就會以 UTF-8 來處理字串與檔案輸出,避免亂碼。
修改 Shell 環境的 Locale 設定:
設定環境變數,例如:
export LANG=zh_TW.UTF-8
export LC_ALL=zh_TW.UTF-8
在這樣的環境下執行 shell script,就能確保 Shell 的輸出也是 UTF-8,進而和 Java 程式保持一致。
建議可以兩種方式結合使用,確保從 Shell 到 JVM 整個流程都採用 UTF-8 編碼,這樣就能有效解決亂碼問題。
我發現執行:
export LC_ALL=zh_TW.UTF-8
會有問題, 所以我執行:
locale -a
結果發現 linux 沒有安裝繁體中文語系
然後我 java 加了:
Charset.defaultCharset()
顯示的是 "US-ASCII"
我不確定是不是這樣造成轉碼問題?
所以我另外裝了一台 rocky linux vm 來模擬測試
(vm有特別安裝了繁體中文語系)
我先模擬 user 環境 profile 只設定:
export LANG=zh_TW.BIG5
然后執行原本的 shell, java 跑出來的:
Charset.defaultCharset()
顯示的是 "BIG5"
並且執行結果沒有亂碼
想請問 java vm 在轉換編碼, 跟安裝繁體中文語系套件有關嗎?