Thursday, September 14, 2006

(XBMC) 讓XBMC也來「Unicode補完」

上次提到修改原始碼,讓XBMC播字幕時回到舊時不需偵測 、不需先前載入的處理模式,讓繁中字幕能比較順利播出。但這只是治標的做法,因為有問題的字元還是會出現亂碼,這種改法並沒有比較進步,只是在逃避問題。

這幾天有空時都在研究改變XBMC裡big5字庫的方法,以求徹底解決這個問題。編碼問題若能解決,真金就不怕火煉,管它偵不偵測呢?

XBMC 目前採用的轉碼字庫(character set conversion library),是公開源碼的GNU Libiconv,版本是1.9.1,這個原始碼在XBMC原始碼裡就有附(libiconv-1.9.1.rar)。這個版本已經蠻舊了,之前曾說過的 各種有問題的字,像是碁、銹、 裏、墻、恒、粧、嫺等擴充字,或像「酶」這種少用字,此版的big5裡都會有問題。我查了一下比較新的1.9.2版,big5字庫仍是沒變,要到現在仍在測試 中的1.11版,才加入了像big5 2003字庫。

過去兩天我都試著從GNU網站下載不同版的來源碼,並試著以MinGW編譯出字庫, 想自行update,但編譯出的字庫格式不對,無法在XBMC上使用。在做了幾次白工之後,無意間打開XBMC所附的1.9.1版,發現裡面早就附上了 Visual Studio .NET的專案檔(inconv.sln),這才覺得自己怎麼那麼笨,不先從手邊有的東西著手,白繞了這麼一大圈。開啟inconv.sln,rebuild solution,在release資料夾中就可以找到XBMC所使用的libiconv.lib了。

當然,在編譯前, 要先更新這次研究的目的--big5的字庫。我找到了以「big5補完計畫」修改過的轉碼表和轉碼函式(big5.h,ces_big5.h),取代 1.9.1裡附的舊檔,重新compile了新的libiconv.lib,取代掉原始碼裡xbmc\lib\libiconv\ libiconv.lib,然後compile新的XBMC,支援Unicode補完計畫的XBMC也就完成了!擷兩張圖來瞧瞧:

以繁中Big5編碼播出的字幕,所有不相容字元一併到齊,還包括「方方土 」先生的罕用字。而且在ansi存檔模式之下,也看得到日文假名。

另換一種字型。字型裡面沒有的字,會出現空白,但不會是亂碼……
以上我用的xbmc,仍是有把enca偵測和前期載入功能關掉的修正版。下次再試試不修改原始碼的正常版效果如何(應該沒差才對)。

差點忘了說,之前測試就有問題的全形「/」符號,仍是無法播出。不過,這應該不會是什麼太大的困擾。
-------
0918補:
又試了幾個符號,現在發現全形「/」是可以顯示的,上次可能是在切換時切錯了,才會出現亂碼。又像音符記號,或簡體字,用補完後的xbmc,都可以順利轉碼。

4 comments:

Anonymous said...

真的太方便的,
如果這樣改的話,
srt(原big5)的編碼需要改成unicode嗎?
版主有意分享修改的檔案嗎?

kaku03 said...

應該這麼說,如果你電腦裡已經安裝了unicode補完,那你在電腦裡以big5存檔的字幕,只要在電腦上看得到的字(包括假名),在換上補完的xbmc裡應該也就看得到,並不需另轉成utf-8。

分享檔案是有想過,但目前仍在測試,搞不好仍有些潛在的問題……

Anonymous said...

那期待囉!
給你加加油

kaku03 said...

已經分享了。本案終結……