結合 cpdetector 及 jchardet 的中文編碼偵測

2008 年 十月 28 日 (星期二) 10:44 pm
分類:電腦
標籤:,

我曾在〈中文編碼偵測〉一文提過 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。

延伸閱讀


◤建議您一併閱讀以下文章:


留言回應

[檢核碼]  


Allowed XHTML tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

本站已啟用 spam 防護機制。為避免系統誤判,請在按下按鈕之前,先備份您的留言,以防不測。如果您一直無法順利留言,請改用 email 方式。
此外,如果您想留的言與本篇文章及討論串無關,也請轉而點選這裡。謝謝您!