2005年5月15日 星期日

glibc 的 charmaps/UTF-8

最近在試用 rxvt-unicode,遇到了一些字寬[1]的問題。於是動手修了 glibc 的 charmaps/UTF-8.gz(Debian 是放在 /usr/share/i18n/charmaps/UTF-8.gz)。如果不想自己動手來,可以下載 http://victor.csie.org/archive/UTF-8.gz,跳到之後的 locale-gen 那段。這是用 Debian 的 glibc 2.3.2.ds1-22 + EastAsianWidth-4.1.0.txt 做出來的。

動手前,請先備份 charmaps/UTF-8.gz。

首先,到 unicode.org 抓一份表格(EastAsianWidth),這個表裡面定義了亞洲字形的寬度。可參考 http://www.unicode.org/reports/tr11/。

接下來我寫了一個 script 來產生符合 glibc 的 charmaps/XXX.gz 的格式。Script 裡面的 __DATA__ 是我目前 charmaps/UTF-8.gz 的 WIDTH 那段中,所有寬度為零的 range。因為來源有好幾個,所以為了方便,就直接從那邊 copy 過來。

./EastAsianWidth.pl  UTF-8.txt


接著,


cp /usr/share/i18n/charmaps/UTF-8.gz UTF-8.gz
gunzip UTF-8.gz


解開得到 UTF-8 後,開個 editor 把檔案最後面,從 "WIDTH" 一直到 "END WIDTH" 取代成 UTF-8.txt 裡面的東西。再壓好放回去原來的位置:


gzip UTF-8
cp UTF-8.gz /usr/share/i18n/charmaps/UTF-8.gz # you need root here.


最後,執行 locale-gen,你可能會看到:


# locale-gen
Generating locales...
zh_TW.BIG5... done
zh_TW.UTF-8...
/usr/share/i18n/charmaps/UTF-8:28542: unknown character `U00002614'
/usr/share/i18n/charmaps/UTF-8:28560: unknown character `U0000FAD9'
/usr/share/i18n/charmaps/UTF-8:28564: unknown character `U0000FE19'
/usr/share/i18n/charmaps/UTF-8:28576: unknown character `U0003FFFD'
/usr/share/i18n/charmaps/UTF-8:28579: unknown character `U000E0100'
#


後面的錯誤是說,EastAsianWidth.txt 裡面定義的字,這幾個不在你的 charmaps/UTF-8 裡面。並不是什麼嚴重的問題,可以不理他。

這樣就大功告成了!接下來如果還有問題,就是 Big5 轉碼表跟字型的問題了吧。

[1] urxvt 是用 wcwidth(3)(也就是在 glibc 裡)判斷字寬。
張貼留言