星期二, 10月 03, 2006

又遇編碼問題

原本以為對文字編碼問題已經相當了解,沒想到最近又碰上一個狀況。

一直以為,Unicode 比 Big5 收錄更多的中文字元,因此從 Unicode 轉碼到 Big5,可能有部分字集無法轉換;但從 Big 轉碼到 Unicode,則不應該會碰到轉碼失敗的狀況。

但上週試圖從 Big5 編碼的網頁擷取內容時,PHP 的 iconv() 函式卻回報轉碼失敗的警告訊息。比較轉碼前後的檔案,發現原來是「恒春」的「恒」轉碼失敗了。

啊,怎麼會這樣?這下子怎麼辦呢?

想不出什麼好方法,只好先用 Windows VBScripting 將儲存下來的檔案,從 Big5 編碼轉成 Unicode,然後直接用 PHP 來讀取 Unicode 檔。比較耐人尋思的是,或許是因為資料處理的流程發生改變,即使是如此簡單的修改,也讓自己著實花了好一番工夫才完成。

事後,我試了一下,Java 程式也可以正確地轉換「恒」的文字編碼。那麼,為什麼 PHP 就不行呢?查閱相關文件,PHP 的 iconv() 好像是採用 GNU 的 libiconv 來執行編碼轉換的。下載 libiconv 來試試,它真的沒有辦法成功轉換「恒」這個字!

唉,看來連 GNU 的軟體,在中文處理上的可信賴度都沒有想像來的高呢。真是只能用嘆氣來形容自己的感覺了。

8 則留言:

lcat 提到...

快點回報這個問題吧!GNU是靠大家來修正錯誤的。

被掛掉的阿尼 提到...

是"恆"跟"恒"的問題嗎
big5裡的應該是"恆", 沒有"恒"這但字

tu 提到...

嗯... 在 Windows 下的 big5 編碼裡,是有這個「恒」字:0xF9DA。不知道是不是修改後的版本。

參考此網頁,裡頭也有收錄。

lcat 提到...

剛剛搜尋了一下,請參考
http://netlab.cse.yzu.edu.tw/~statue/freebsd/zh-tut/big5.html
內 Table 3-3

應該是擴充字的問題吧?

tu 提到...

嗯,看起來 Big5 這個「通稱」,還真的有很多個版本。貓還是比較厲害,能夠找到這樣的資訊 :)

libiconv 不知道支援到那些版本...

lcat 提到...

libconv 支援
http://www.gnu.org/software/libiconv/
Chinese
EUC-CN, HZ, GBK, GB18030, EUC-TW, BIG5, CP950, BIG5-HKSCS, ISO-2022-CN, ISO-2022-CN-EXT

Big5變化可以參考
http://www.moztw.org/docs/big5/

tu 提到...

啊,這麼多版本... 昏頭了~

匿名 提到...

感謝樓上的訊息,我解決了我ruby on rails上面的ㄧ個轉碼問題...感恩感恩!