2008年7月21日 星期一

[Java] 英文版 Windows 編譯出來的程式, 中文是亂碼?

如果你安裝英文版的 Windows,  而且使用 JDK 1.5  建立 Java 應用程式, 你將會發現程式中所有的中文輸出, 都會因為你是英文 Windows 而錯誤轉碼形成亂碼.

例如:

// in Main.java

 javax.swing.JOptionPane.showMessageDialog(null,"測試");

"c:\Program Files\Java\jdk1.5.0_15\bin\javac" Main.java

 

執行結果, 會變成下面這樣.

wrong_display

 

這是因為你的 java 原始程式中, 有非 Unicode 字元 "測試", 在 javac 進行轉碼時使用了錯誤的轉碼表所造成的.

 

在這篇文章中, 我提了三種解決方法:

snap003

解決方法 1: 告訴 javac 在 source code  裡遇到非 Unicode 字元時, 用 Regional Options 的設定轉換.

這時請到 [Control Panel] -> [Regional and Language Options] 選項中, 確定一下將 Regional Options 是否為 Chinese (Taiwan).

RegionalOption_US

把 United States 改成 Chinese (Taiwan)

RegionalOption_Taiwan

這樣就能解決大部分的問題了. (尤其當你使用 JBuilder 建立專案)

 

解決方法 2:  告訴 javac 在 source code  裡遇到 非 Unicode 字元時, 請用 Big5 解釋.

作法如下:

"c:\Program Files\Java\jdk1.5.0_15\bin\javac" -encoding Big5 Main.java

執行結果:

encoding_Big5

所以, 如果你在英文版作業系統下, 編譯 java 時遇到亂碼可以用這樣的方式解決.

 

徹底解決方案: 在原始程式中, 使用 Unicode 表示你的字元

這樣根本不用指定編碼轉換, 一定會正確顯示你要的文字.

JOptionPane.showMessageDialog(null,"\u6e2c\u8a66","Unicode escape sequences",JOptionPane.PLAIN_MESSAGE);

 

至於如何得知 "測試" = \u6e2c\u8a66呢?  java 提供 native2ascii 幫你批次處理轉換.  (請搭配 ResourceBundle class 幫你載入轉換好的字串)

如果不想那麼麻煩, 你也可以用 Notepad 將中文存成 Unicode 格式, 然後用 UltraEditor 看一下編碼, 然後填進去\uNNNN 格式也可以.

 

如果你的程式有可能發行到印度或日本, 那應該使用這個方法, 進行多國語言程式的開發. 請翻譯社把字串翻譯成天城文或日文, 然後將輸出字串用統一用 ResourceBundle class 進行管理.

 

下面是一個簡單的範例

  Main.java make_with_encoding  make_without_encoding 

  完整測試專案

 

自己, 試試看吧.  ^_^

 

by Jing

5 則留言:

  1. 我用的是英文版的vista你說的路徑我都找不到!!!

    回覆刪除
  2. 請稍微具體描述一下你的問題
    哪一個路徑呢?

    回覆刪除
  3. 這個路徑
    c:\Program Files\Java\jdk1.5.0_15\bin\javac" Main.java

    回覆刪除
  4. 這個路徑
    "c:\Program Files\Java\jdk1.5.0_15\bin\javac" Main.java
    而且我的java版本是version 6

    回覆刪除
  5. 恩. 那麼這個目錄應該是你的 javac.exe 的完整目錄.

    回覆刪除