glibc 的 charmaps/UTF-8 May 15
最近在試用 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 裡)判斷字寬。