iT邦幫忙

1

java 程式參數轉碼的問題

  • 分享至 

  • xImage

linux 下面用 shell 執行 java 程式
shell 是既定的編碼 ASCII (ISO-8859)
內容:
app=$(basename $0)
workday=date +%Y%m%d
java Worklog $app $workday "工作日誌"

java 程式是用 UTF-8 編碼, 轉寫到檔案卻是亂碼
請問如何解約編碼不同造成亂碼的問題

.

1 個回答

4
zivzhong
iT邦研究生 3 級 ‧ 2025-02-21 15:44:01

這個問題主要是因為 JVM 預設使用系統的檔案編碼(在你的情況下是 ASCII/ISO-8859),而你的 Java 程式和來源碼是以 UTF-8 編碼所撰寫,導致在處理中文字串(例如「工作日誌」)時出現亂碼。

解決方法有兩種:

  1. 強制 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 來處理字串與檔案輸出,避免亂碼。

  2. 修改 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 編碼,這樣就能有效解決亂碼問題。

magread iT邦新手 5 級 ‧ 2025-02-22 15:56:40 檢舉

我發現執行:
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 在轉換編碼, 跟安裝繁體中文語系套件有關嗎?

我要發表回答

立即登入回答