關于 Big 5 編碼,請查閱「CJKV Information Processing」一書的附錄 H(O´Reilly出版)。
編譯時的注重事項
編譯的時候,假如你不說明原始文件編碼方式的話, javac 編譯器在讀進此原始程序文件,開始編譯之前,會先去詢問操作系統檔案預設的編碼方式為何。以繁體中文 Windows 98 來說,javac 會先詢問 Windows 98,得知檔案是用 MS950 的方式編碼。然后就可以將檔案由 MS950 轉成 Unicode 編碼方式,開始進行編譯。
通常在編譯階段,會造成的錯誤有下列幾種可能:
1. 假如操作系統的國籍資料設定錯誤,會造成 javac 編譯器取得的編碼信息是錯的。
2. 較差勁的編譯器可能沒有主動詢問操作系統的編碼方式,而是采用編譯器預設的編碼方式。
3. 假如原始程序不是用編譯當時操作系統預設的編碼方式存盤的,也會造成錯誤。比方說,原始程序文件是臺灣程序員寫的,在繁體中文版的 Windows上以 MS950 編碼存盤,再經由網絡傳送到泰國,在泰文版的 Windows 上編譯(泰文版 Windows 預設的檔案編碼方式是 MS874)。
這種因為原始程序文件編碼方式和編譯器無法匹配所造成的問題,輕則編譯成功但執行時文字出現亂碼或出現 Error/Exception,重則無法成功編譯。這時候,你需要主動透過「-encoding」選項來指定原始程序的編碼方式,編譯器會以你指定的編碼為主,不會再去詢問操作系統。下面的例子,我們告訴編譯器「TaiwanClass.java」是以繁體中文版 Windows 的「MS950」編碼的:
javac ?encoding MS950 TaiwanClass.java
假如你手上只有某 class 文件,沒有原始程序文件,而且你確定其 constant pool 的UTF-8 字段編碼錯誤,你有兩種方式可以用來修正編碼:
public InputStreamReader(InputStream in, String enc) throws UnsupportedEncodingException; public OutputStreamWriter(OutputStream out, String enc) throws UnsupportedEncodingException;