結合 cpdetector 及 jchardet 的中文編碼偵測
2008 年 十月 28 日 (星期二) 10:44 pm分類:電腦
標籤: programming, Java
我曾在〈中文編碼偵測〉一文提過 jchardet 這個 Java 版的編碼偵測系統。這套由知名的 Mozilla Charset Detector 移植而來的版本,大體上都能正常運作,不過,面對比較糾纏古怪的中文碼,尤其是像 GB2312 簡體中文,常會誤認為 Big5,慘呀!
根據 “Character encoding detection″ 這篇文章的評比,cpdetector 似乎是不錯的替代方案。嚴格來說,cpdetector 是個可塑性極高的編碼偵測框架,可安裝數種偵測器子系統,像白箱規則式的 ByteOrderMarkDetector 及
ParsingDetector,甚至還附帶一個 JChardetFacade 將黑箱統計式的 jchardet 也網羅其中,因此,它很有機會成為面面俱到的編碼偵測母系統。
拿〈历史的意义——读《明朝那些事儿》有感(三)〉這篇簡體中文文章稍微小試一下,jchardet 誤判為 “Big5″,cpdetector 官方網站提供的範例程式則正確地判定為 “GB2312″。其他像〈淘宝公布屏蔽不良搜索引擎后的一年报告〉和〈西班牙女国防大臣挺着大肚子阅兵引起各方争议〉文章也是一樣。
看起來,cpdetector 會是比 jchardet 更好的選擇?
不過,如果拿 Google 台灣網站 http://www.google.com.tw/ 去試,jchardet 正確地判定為 “UTF-8″,cpdetector 反而非常幽默地誤判為 “Big5″。這是怎麼一回事呀?
如果再將範例程式的 detectCodepage(URL url) 函數呼叫改成另一個 detectCodepage(InputStream in, int length) 版本,cpdetector 就能正確地判定為 “UTF-8″。
為什麼兩種方式得到的結果不一樣?原因不明。
此外,cpdetector 也會在某些情況下吐出 exceptions,jchardet 則不太會有這種情況。會是因為 cpdetector 用的 ANTLR 是舊版的 2.7.7,而不是新的 v3 系列?我不知道。
種種不確定因素,我決定採取兩階段模式:先以準確度較高的 cpdetector 的 detectCodepage(InputStream, int) 辨識編碼,若產生 exception 則改由較穩定的 jchardet 接棒。
當然啦,長遠之計,還是該檢視 cpdetector 程式碼,看看問題出在哪裡;也希望有一天能將 ANTLR 升級至 v3。
延伸閱讀
- 編碼偵測系統評比:Character encoding detection
- cpdetector 介紹:〈判定文件編碼或文本流編碼的方法〉


追蹤留言回應:以
引用通告 (trackback):![[add to funP]](http://william.cswiz.org/blog/wp-content/themes/william/images/add-funp.png)
![[add to HEMiDEMi]](http://www.hemidemi.com/sticker/user/roxytom.bluecircus.net.gif)
![[add to udn bookmark]](http://bookmark.udn.com/html/help/80_20_02.gif)
