中文編碼 Encoding cpDetector

Java辨視中文的編碼格式-Big5、UTF8

葉文華 2017/08/29 10:57:09
13994

1. 目的

對於開發人員來說,Java程式語言需要明確指定並處理文字編碼是理所當然的事,除了執行環境的編碼之外,IO也是需要注意的部分。在許多資料串接或是遺留系統上,編碼與現行環境或使用需求有可能出現較複雜的處理情境,尤其是早期編碼環境流行使用Big5,即可能發生與UTF-8交互使用而衍生一些問題;或是Windows環境的造字問題等。因此,文字編碼的處理與判斷問題,總是不斷發生,本文即針對此問題進行驗證。

    

    

    

2. 開始前準備

Eclipse

JDK 1.8

cpdetector 1.0.10

chardet 1.0




3. 撰寫編碼驗證程式

3.1. 以檔BOM來檢查文字檔案編碼

利用Unicode的檔首BOM來檢查是否文字檔案編碼為UTF-8,無BOM則當作是Big5


3.2. 以套件cpdetector檢查文字檔案編碼

cpdetector套件協助檢查編碼(其中JChardetFacade包含了使用MozillaJChardet),並且可以再增加探測器,如ASCIIDetectorUnicodeDetector

        

        

3.3. 以轉碼前後文字比較檢查文字檔案編碼

byte方式指定編碼再轉碼後與原始文字進行比較,其中特別指定了Windows系統中的預設編碼MS950



4. 建立測試編碼用文字檔

建立Big5、UTF-8(有檔首BOM)、UTF-8(無檔首BOM)三分檔案,內容包含中、英文及造字文字。

Big5:

UTF-8(有檔首BOM):

UTF-8(無檔首BOM):

Windows自行造字:

        


5. 編碼檢查驗證結果

撰寫測試程式,呼叫本文設計的三種檢查編碼方式,記錄花費時間及利用檢查取得編碼來讀取文字檔案,並顯示log在console以方便人為檢視結果。


> 檢查Big5編碼文字檔案結果:

. 以檔首BOM來檢查文字檔案編碼,由於Big5沒有檔首BOM,故判定結果為預設編碼的Big5,但由於內容包含了造字文字,Java並沒有辦法正確用Big5來顯示文字內容,造字部分發生錯誤而顯示為亂碼。

. 以套件cpdetector檢查文字檔案編碼,判斷結果是UTF-16LE,Java以該編碼顯示全為亂碼。

. 以轉碼前後文字比較檢查文字檔案編碼,判斷結果是MS950,Java正確以該編碼顯示原始內容。


> 檢查UTF-8(有檔首BOM)編碼文字檔案結果:

. 以檔首BOM來檢查文字檔案編碼,正確識別了文字內容為UTF-8,Java即顯示了原始內容,但由於包含BOM的關係,故多出現了一個問號(?)。

. 以套件cpdetector檢查文字檔案編碼,也判斷正確。

. 以轉碼前後文字比較檢查文字檔案編碼,也判斷正確。


> 檢查UTF-8(無檔首BOM)編碼文字檔案結果:

. 以檔首BOM來檢查文字檔案編碼,由於內容沒有檔首BOM,故判定結果為預設編碼的Big5,Java以編碼顯示內容即為亂碼。

. 以套件cpdetector檢查文字檔案編碼,判斷正確。

. 以轉碼前後文字比較檢查文字檔案編碼,也判斷正確。


綜合以上結果,僅以檔首BOM來檢查編碼確實不適當;套件cpdetector似乎對於中文環境常有的造字有辨視錯誤問題;以轉碼前後文字比較方式檢查在此驗證中是可行的方式,雖然可能發生大量轉碼的效能疑慮,但仍不失為可應對的方向之一。




6. 參考來源

- cpDetector-https://sourceforge.net/projects/cpdetector/

葉文華