原來是 UAO 搞的鬼

話說日本的相片還沒傳完,又碰上小程式的 bug,只好暫時停滯了,其實這個 bug 老早就在了,只是自己一直不知道怎麼解決罷了,只不過這麼大量的照片都要我手工處理的話,大概會瘋掉,只好趁著看完卡通的空檔(為什麼不是唸書的空檔?!)研究一下。

這個 bug 基本上就是:Big5 缺字的問題

理論上現在的軟體都朝向 unicode 化發展,這個問題應該會越來越少見才對,無奈我用來管理照片的 Picasa2 就是這麼智障的軟體,看他的設定檔應該是有 unicode,不過寫到照片裡的 caption 居然還是用 big5 來存,實在讓人受不了,Google 好像也沒打算修改的感覺,為了轉換,我也只好在自己的 uploader 裡轉碼了。

我的 Uploader 是一隻 perl script,會幫我上傳、加 tag、收 group 之類的,所以我只要在 Picasa 裡寫好一次 Caption 就可以從頭用到尾,傳照片時的相片說明就用 Text::Iconv 來轉,這個 module 底層用的是 GNU libiconv 這個函式庫,因此也是走正規的編碼方式。

好死不死的我在 Windows 裡都裝了所謂的 Unicode 補完計畫,它會修改轉碼的 table,所以在以 Big5 為底層的 Picasa 中,可以正常的顯示簡體字和日文字,但這些被它偷改過的編碼就不符合正規標準,libiconv 當然就會轉換失敗。

原則上可以利用一些參數讓 libiconv 遇到錯誤時不會爛掉,但這樣我還是得手工一張一張修,還是於初衷不合。

為了嘗試出以上的結論,我先試了 windows 版的 perl,不過安裝 modules 容易有問題,起碼我不知道怎麼編譯 Text::Iconv,而且 windows 的命令提示字元也是跑 Big5 的,從命令列輸入進去的內容全部要重新轉碼,不實際。

而 utf-8 的命令列要哪找?結果是用了 cygwin + utf-8 patch,安裝過程花了不少時間,cygwin 的安裝程式實在很難用,package 的管理方式也很怪,能用的 package 也是缺東缺西,最後還是要自己抓下來編譯,總之是弄好了。

經過多番嘗試後,發現原來是 Unicode 補完計畫在搞鬼,把 GNU libiconv patch 過後,已經可以正確轉換「不正確的字碼」,但奇怪的是,Text::Iconv 好像不聽話,轉不過去的還是轉不過去,不管怎麼移除重裝都一樣,放棄放棄。

原本想利用 try and catch 來處理 Text::Iconv 丟出來的 exception,可是它沒有提供 API 讓人自己載入自訂的 table,要自己弄一套轉碼程式,有那麼強就好了。最後用的是大爛招,呼叫外部程式來轉了。

唉唉~好不容易才弄一個段落,而且還是 (windows + cygwin + post-patched libiconv)-only 版本,到時候換台電腦、換個系統又要爛了,起碼,讓我撐一陣子吧!

2008.07.08

2 Comments

Leave a Reply