[Kakasi-dev 58] kakasiライブラリでの不具合(?)および対処報告

tk_kuro @ d1.dion.ne.jp tk_kuro @ d1.dion.ne.jp
2007年 3月 9日 (金) 15:13:56 JST


関係各位、
お世話になっております。

text::kakasiにてkakasiのライブラリ処理内にて
不具合が発生していましたので、報告させていただきます。

【動作環境】
OS		:AIX 5.3
perl		:5.8.2
kakasi		:2.3.4
text::kakasi	:2.04
itaijidict 	:kakasiのデフォルト辞書
kanwadict	:kakasiのデフォルト辞書
LANG		:ja_JP.SJIS(AIXのデフォルトJa_JPから変更)

【使用用途】
namazuにてtext::kakasiを使用した分かち書きをしたい。

【現象】
kakasiコマンドとtext::kakasiにて"引越を考えています。"を分かち書きすると
以下のような差異がでました。
・kakasi(パラメータ:-isjis -osjis -w)
	"引越 を 考え ています 。"
・text::kakasi(パラメータ:-isjis -osjis -w)
	"引 越 を 考え ています 。"

kanwadictには"引越"が存在するのですが、text::kakasiではうまく処理されません
でした。
また、Windows環境で動作した場合にはtext::kakasiでもkakasiコマンドと
同じ結果が返されました。

AIX特有の現象かもしれません。

【原因】
ライブラリ化されたitaiji.cソース内のmkitaijitbl関数にて
kakasiコマンドとの実行結果に相違がありました。

64行目から
    while(fgets(buffer, BUFSIZE, fp) != NULL) {
/* デバッグ用に追加 */fprintf(stderr, "%s", buffer);
	sscanf(buffer, "%1c%1c%1c%1c", &n1, &n2, &o1, &o2);
	n1 &= 0x7f;
	n2 &= 0x7f;
	ittbl1[n1][n2] = o1;
	ittbl2[n1][n2] = o2;
/* デバッグ用に追加 */fprintf(stderr, "mkitaijitbl::changeAfter::n1(%d):n2(%
d):o1(%d):o2(%d)\n", n1, n2, o1, o2);
    }

kakasiコマンドにて実行(パラメータ -isjis -osjis -w )
	芦蘆
	mkitaijitbl::changeAfter::n1(176):n2(178):o1(233):o2(195)
	壱一
	mkitaijitbl::changeAfter::n1(176):n2(237):o1(176):o2(236)
	苅刈
	mkitaijitbl::changeAfter::n1(180):n2(163):o1(180):o2(162)
	舘館
	mkitaijitbl::changeAfter::n1(180):n2(220):o1(180):o2(219)
	曽曾
	mkitaijitbl::changeAfter::n1(193):n2(190):o1(193):o2(189)
	・
	・
	・

perlよりtext::kakasiを実行(パラメータ -isjis -osjis -w )
	芦蘆
	mkitaijitbl::changeAfter::n1(176):n2(178):o1(233):o2(10)
	壱一
	mkitaijitbl::changeAfter::n1(176):n2(250):o1(204):o2(10)
	苅刈
	mkitaijitbl::changeAfter::n1(180):n2(163):o1(180):o2(162)
	舘館
	mkitaijitbl::changeAfter::n1(180):n2(220):o1(180):o2(219)
	曽曾
	mkitaijitbl::changeAfter::n1(193):n2(190):o1(193):o2(189)
	・
	・
	・

上記結果よりbufferには正しくitaijidictのレコードが取り出されているのですが、
sscanfにて1文字づつ分けた結果が異なっております。

【対処】
	sscanf(buffer, "%1c%1c%1c%1c", &n1, &n2, &o1, &o2);
を
	n1 = buffer[0];
	n2 = buffer[1];
	o1 = buffer[2];
	o2 = buffer[3];
に変更したところ、text::kakasiでも正常に分かち書き出来るようになりました。


何故コマンドラインとperlからのコールにて差異が出るのかは
納得できていませんが、何かの役に立てればと思い、取り合えず
ご報告させていただきます。

以上





Kakasi-dev メーリングリストの案内