C/Migemoの辞書についての覚え書き(作成の流れ、エンコーディング)
C/Migemo 1.3c MITライセンス版のMandriva Linux向けのRPMパッケージを作成したのだが、その作成過程におけるメモ(主に辞書まわりに関して)を先にここでまとめておく。
C/Migemoの辞書について
C/Migemoの動作に必要な辞書は日本語入力プログラムSKKの辞書から生成する。C/Migemoをソースツリーからビルドすると、途中でcurl(なければwget、fetchを探して見つかったものを使用)で自動的にSKK.JISYO.Lをダウンロードして変換処理を行う。
2008年11月現在、最新版は
openlab.ring.gr.jp/skk/skk/dic/
からダウンロードできる。
辞書のエンコーディング
2008年11月現在、SKKの辞書はEUC-JPのエンコーディングで配布されていて、C/Migemoのビルド時にこれをqkc*1(なければnkf)でエンコーディング変換を行ってエンコーディングごとのディレクトリに分けて配置し、インストールする形になっている。具体的には、[インストール先接頭辞]/share/migemo/euc-jp/以下にEUC-JPの
- migemo-dict
- han2zen.dat
- hira2kata.dat
- roma2hira.dat
というファイル群が、[インストール先接頭辞]/share/migemo/utf-8/以下にUTF-8の上記ファイル名のファイル群が配置されるようになっている。
既定(「gcc-dict」ターゲット)ではEUC-JP版の辞書のみ作成され
ファイル名: cmigemo-1.3c-MIT/dict/dict.mak
############################################################################## # for GNU/gcc(Linux他) # gcc: euc-jp
上記部分の「euc-jp」を「euc-jp utf-8」もしくは「utf-8 euc-jp」に書き換えたときにUTF-8版も作成される。もちろん、日本語1文字が3〜4バイトになる分だけUTF-8版はファイルサイズも大きい。
UTF-8版辞書の必要性について
GNU Emacs
GNU EmacsでC/Migemoを使用するためにはRuby版Migemoに含まれるコードmigemo.elを使用し、該当部分のコメント記号(「;」)を外して;; for C/Migemo (setq migemo-command "cmigemo") (setq migemo-options '("-q" "--emacs" "-i" "\g")) (setq migemo-dictionary "[EUC-JP版migemo-dictのあるディレクトリ]/migemo-dict") (setq migemo-user-dictionary nil) (setq migemo-regex-dictionary nil)
のようにしてEUC-JP版の辞書を読み込むようにすると正常に動作する。
vim
C/Migemo同梱のvimプラグインでも同様にfunction! s:SearchDict() let path = $VIM . ',' . &runtimepath let dict = globpath(path, "dict/migemo-dict") if dict == '' let dict = globpath(path, "migemo-dict") endif if dict == '' let dict = '[EUC-JP版migemo-dictのあるディレクトリ]/migemo-dict' if !filereadable(dict) let dict = '' endif endif return matchstr(dict, "^[^\<NL>]*") endfunction
のようにして動作することを確認。
UTF-8環境の端末で直接コマンド実行
UTF-8環境の端末から検索する場合(下の例では「toky」を渡している)は$ echo toky | cmigemo -d [EUC-JP版migemo-dictの場所] | iconv -f eucjp -t utf8 migemo_open("[EUC-JP版migemo-dictの場所]")=0xd6a010 clock()=0.190000 QUERY: PATTERN: (toky|東京|ト(ーキョー|キ[ャィュェョ])|toky|とき[ゃぃゅぇょ]|徒競走|都響) QUERY:
iconvで出力をUTF-8のエンコーディングに変換すれば化けない。