中文排序一直有點頭疼。
Big-5 碼是按筆劃排,但是次常用字會排在後面,也就是說筆劃少的次常用字,反而會排在筆劃多的常用字後面,例如『万』會排在『籲』後面去。
Unicode 則是依部首排,部首相同的才依筆劃數來排,這也不符合我們的需求。例如『正』會排在『果』後面去。
我們一般文書處理上,需要的是依筆畫數來排序。
這在什麼地方要用到呢?就是書籍索引及參考文獻要用到。
我目前已依 Unihan.txt 整理出各漢字的筆劃數(但不完整,只有 27921
個字的統計資料),目前可以針對漢字求得其筆劃後用來排序,效果還可以,只是我用 ruby + sqlite
來寫,速度上不是很快就是了。不知道大家有沒有現成的 solution?
我主要是要用在 makeindex/mkindex 的地方。
我暫時把一些不成熟(有的部份還沒有完成,有的部份寫得很爛)的小工具放在 CLE,有興趣的朋友,可以先玩看看:
ftp://cle.linux.org.tw/tex/cjk/tools/index
你要先安裝 ruby, rubygem-sqlite3(當然要先安裝 sqlite3), rubygem, ruby-iconv。
那個 cstrokes.db,是由 builddb.rb 從 Unihan.txt 來建立的,你也可以自行建立。adddb.rb/deldb.rb 可增刪這個資料庫內容。資料庫的結構可以參考原始碼的內容。放心,我是程式低能兒,不會寫複雜的東西。
strokes.rb 可以計算某個字的筆劃數。chsort.rb 可以做中文排序(按筆劃數來排)。當然索引的部份尚需努力。
bg5-sortb5.txt/bg5-sortu8.txt 是一個排序的例子。你可以和系統上的 sort 比較一下排序的結果。
ps.由於我針對的是 LaTeX CJK 的中文索引,所以,將來完成後,可能無法用在一般的排序上,所以,目前先暫時放出來,大家來吐嘈一下。