試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

C/Migemoの辞書についての覚え書き(作成の流れ、エンコーディング)

C/Migemo 1.3c MITライセンス版のMandriva Linux向けのRPMパッケージを作成したのだが、その作成過程におけるメモ(主に辞書まわりに関して)を先にここでまとめておく。

  1. C/Migemoの辞書について
  2. 辞書のエンコーディング
  3. UTF-8版辞書の必要性について
    1. GNU Emacs
    2. vim
    3. UTF-8環境の端末で直接コマンド実行
    4. 結論

C/Migemoの辞書について

C/Migemoの動作に必要な辞書は日本語入力プログラムSKKの辞書から生成する。C/Migemoをソースツリーからビルドすると、途中でcurl(なければwgetfetchを探して見つかったものを使用)で自動的に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を使用するためにはRubyMigemoに含まれるコード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エンコーディングに変換すれば化けない。

結論
少なくとも、上記の使い方においてはUTF-8版辞書は不要と判断できる。逆に、EUC-JP版がないと無駄に面倒になりそう。パッケージには/usr/share/migemo/以下にEUC-JP版の辞書(migemo-dict)と3つの.datファイルを配置する形でvimEmacsプラグインの.specファイルを調整することに。

*1:Debian/Ubuntu/Mandrivaにはないが、Gentooにはある・機能はエンコーディングと改行コードの変換でnkfに近い