ruby-kakasiを導入してみたのですが、どうも動きがおかしいことに気づきました
どういう時におかしいかというと連続で違う引数で呼び出す際にどうやら2回めの呼び出し時の引数が聞いていないような感じです。しかもローマ字に変換する際にヘボン式か訓令式か変更した場合のみです
こんなコード
#!ruby #coding:utf-8 require "kakasi" require "nkf" keyword="し ち つ ふ じ ぢ しゃ しゅ しょ ちゃ ちゅ ちょ じゃ じゅ じょ ぢゃ ぢゅ ぢょ" p Kakasi.kakasi("-Ea -Ja -Ka -Ha ",NKF.nkf("-e",keyword)) p Kakasi.kakasi("-Ea -Ja -Ka -Ha -rk",NKF.nkf("-e",keyword))
結果がこれ
$ ruby test.rb "shi chi tsu fu ji di sha shu sho cha chu cho ja ju jo dya dyu dyo" "shi chi tsu fu ji di sha shu sho cha chu cho ja ju jo dya dyu dyo"
最初kakasi-rubyがおかしいのかと思いソースコードをいじってみていたのですがどうやらそうではなく、本体側がおかしいことがわかりました。
このぶぶん
--- kakasi-2.3.4/src/hh2.c 2001-05-30 14:46:55.000000000 +0900 +++ kakasi-2.3.4_mod/src/hh2.c 2013-04-23 18:23:04.000000000 +0900 @@ -192,7 +192,7 @@ int max_match, match_more; char *max_romaji; - if (index_made == 0) { +// if (index_made == 0) { int last; for (i = 0; i < 0x81; ++ i) { @@ -211,7 +211,7 @@ last = index_table[i]; } index_made = 1; - } +// } buffer[H2rom_buflen-1] = '\0'; clen = H2rom_buflen-1; for (i = 0; i < (H2rom_buflen-1)/2; i ++) {
どうも訓令式とヘボン式のテーブルを切り替えて使っているようなのですが、高速化のためか一文字目の際にテーブルを作成し、それ以降はキャッシュを見るような感じになっています。しかしstatic変数で管理しているため、Library使用時にはこれがクリアされず、2回めのライブラリ呼び出し時には前回のキャッシュをそのまま使っていたようです
とりあえずキャッシュ部分を削除してみました。
本来ならばきちんと治すべきなのですが、、、、、
本体修正後rubyを実行
ruby test.rb "shi chi tsu fu ji di sha shu sho cha chu cho ja ju jo dya dyu dyo" "si ti tu hu zi di sya syu syo tya tyu tyo zya zyu zyo dya dyu dyo"
期待通りとなりました