Masanari Yamamoto
h0131****@ice*****
2005年 2月 15日 (火) 21:53:17 JST
山本です。 On Tue, Feb 15, 2005 at 05:28:00PM +0900, YamaKen wrote: > At Tue, 15 Feb 2005 15:35:59 +0900, > h0131****@ice***** wrote: > > On Sun, Feb 13, 2005 at 01:50:30PM +0900, Masanari Yamamoto wrote: > > > これでuim-fepを起動できるようになったのですが、SKKが選択できません。 > > > なにが原因なのかよくわかりません。 > > > trussで確認しましたが、libuim-skk.soはopenできているようです。 > > > truss uim-fep 2>&1 | grep skk > > > > > > uim-fep -hで使用できる変換エンジンを確認したらtcodeとtutcodeも使えない > > > ようです。 > > > > > > pyunihan (zh_CN) Pinyin input method (Unicode version) > > > pinyin-big5 (zh_TW:zh_HK) Pinyin input method (Traditional Chinese version) > > > hangul2 (ko) 2-bul style hangul input method > > > hangul3 (ko) 3-bul style hangul input method > > > romaja (ko) Romaja input style hangul input method > > > viqr (vi) VIetnamese Quoted-Readable > > > ipa () International Phonetic Alphabet (X-SAMPA) > > > latin () Latin characters mainly used for Latin and German languages > > > direct (*) Pass through all user input without any modification > > > > solarisではLANG=jaとなっているのですが、これが原因のようです。 LANG=jaは関係ありませんでした。 LANG=ja_JP.eucJP にしてもskkなどが選択できませんでした。 > > share/uim/loader.scmのskkのエンコーディングを"EUC-JP"から"UTF-8"に変え > > たらskkが選択できるようになりました。 > > 症状だけ見るとiconv(3)がEUC-JPを扱えてないようにも見えますが、 > とりあえず以下のように実行するとどうなるでしょうか。 > > $ uname -sr > FreeBSD 5.3-RELEASE > $ LC_ALL=ja uim-sh > uim> installed-modules > uim> installed-im-module-list > ("pyload" "anthy" "canna" "skk" "tcode" "tutcode" "hangul" "viqr" "ipa" "latin" "m17nlib") > uim> enabled-im-list > (anthy canna skk tcode hangul2 viqr ipa latin m17n-ko-hangul2 m17n-zh-py pinyin-big5 direct) > uim> (find-im 'skk #f) > (skk "ja" "EUC-JP" "SKK" "uim version of SKK input method" () #<CLOSURE (id fake-im fake-arg) (let* ((stub-im (retrieve-im name)) (stub-im-init-handler (and stub-im (im-init-handler stub-im)))) (and (require-module module-name) (let* ((im (retrieve-im name)) (init-handler (im-init-handler im)) (arg (im-init-arg im)) (context (if (not (eq? init-handler stub-im-init-handler)) (init-handler id im arg) (begin (error "stub IM actualization failed") ())))) context)))> () () () () () () () () "skk") このようになりました。 $ uname -sr SunOS 5.7 $ LC_ALL=ja uim-sh uim> installed-modules ERROR: unbound variable (errobj installed-modules) uim> installed-im-module-list ("pyload" "skk" "tcode" "tutcode" "hangul" "viqr" "ipa" "latin") uim> enabled-im-list (py pyunihan pinyin-big5 skk tcode tutcode hangul2 hangul3 romaja viqr ipa latin direct) uim> (find-im 'skk #f) (skk "ja" "EUC-JP" "SKK" "uim version of SKK input method" () #<CLOSURE (id fake-im fake-arg) (let* ((stub-im (retrieve-im name)) (stub-im-init-handler (and stub-im (im-init-handler stub-im)))) (and (require-module module-name) (let* ((im (retrieve-im name)) (init-handler (im-init-handler im)) (arg (im-init-arg im)) (context (if (not (eq? init-handler stub-im-init-handler)) (init-handler id im arg) (begin (error "stub IM actualization failed") ())))) context)))> () () () () () () () () "skk") uim> > 私のところではdefault-im-nameが#fの状態で以下のように意図通りに > 動いています(LC_ALLをLANGに変えても同じです)。localeはIMの自動選 > 択ぐらいにしか使ってなかったと思うので、今の時点ではちょっと原因 > の予想がつきません。 > > $ LC_ALL=ja uim-fep -h > [input method] > pinyin-big5 (zh_TW:zh_HK) Pinyin input method (Traditional Chinese version) > anthy (ja) A multi-segment kana-kanji conversion engine > canna (ja) A multi-segment kana-kanji conversion engine > skk (ja) uim version of SKK input method > tcode (ja) A kanji direct input method > hangul2 (ko) 2-bul style hangul input method > viqr (vi) VIetnamese Quoted-Readable > ipa () International Phonetic Alphabet (X-SAMPA) > latin () Latin characters mainly used for Latin and German languages > m17n-ko-hangul2 (ko) An input method provided by the m17n library > m17n-zh-py (zh) An input method provided by the m17n library > direct (*) Pass through all user input without any modification > > 調べてみたら原因がわかりました。uim-fepでuim_create_contexに渡す encodingが"euc-jp"のように小文字にしていたのが駄目でした。このため、 uim_iconv_is_convertibleのtocodeが"euc-jp"、fromcondeが"EUC-JP"になり 、iconv_open("euc-jp", "EUC-JP")が-1になってuim_iconv_is_convertibleが 0になるために、skkがはじかれていました。 int uim_iconv_is_convertible(const char *tocode, const char *fromcode) { iconv_t ic; if (!strcmp("UTF-8", fromcode) || !strcmp(tocode, fromcode)) { return 1; } /* TODO cache the result */ ic = iconv_open(tocode, fromcode); if (ic == (iconv_t)-1) { return 0; } iconv_close(ic); return 1; } 質問なんですけど、uim_create_contexに渡すencodingはどのように決めれば いいのでしょうか? uim-fepでは以下のように、locale="ja"のときは"EUC-JP"、 それ以外はlocaleの"."の右側の文字列、"."がなければ、"UTF-8"というように する予定なんですが。 const char *get_enc(void) { const char *locale; if ((locale = setlocale(LC_CTYPE, "")) != NULL) { if (strcasecmp(locale, "ja") == 0) { return "EUC-JP"; } else { char *ptr = strstr(locale, "."); return ptr != NULL ? ptr + 1 : "UTF-8"; } } return "UTF-8"; } > > あと、バグを見つけたのですが、 > > mkdir build && cd build && ../configure --options > > のように別のディレクトリでビルドすると、share/uim/loader.scmにdirectの > > エントリしか書き込まれないようです。 > > > > loader.scmを作る部分はこのようになっていました。 > > > > echo "(require \"manage-modules.scm\") \ > > (generate-loader-scm)" \ > > | LIBUIM_VERBOSE=1 LIBUIM_VANILLA=1 LIBUIM_SCM_FILES=../../scm LIBUIM_PLUGIN_LIB_DIR=../../uim/.libs \ > > ../uim/uim-sh -B >loader.scm > > 調査ありがとうございます。こんな感じでどうでしょうか。 > > ---------------------------------------------------------------- > Index: scm/Makefile.am > =================================================================== > --- scm/Makefile.am (revision 654) > +++ scm/Makefile.am (working copy) > @@ -68,7 +68,7 @@ > (require \"manage-modules.scm\") \ > (generate-installed-modules-scm)" \ > | LIBUIM_VERBOSE=1 LIBUIM_VANILLA=1 LIBUIM_SCM_FILES=$(top_srcdir)/scm LIBUIM_PLUGIN_LIB_DIR=$(top_srcdir)/uim/.libs \ > - $(top_builddir)/uim/uim-sh -B >$@ > + $(top_builddir)/uim/uim-sh -B >$(top_builddir)/scm/$@ > > # TODO: resolve dependency to $(top_builddir)/uim/uim-sh in proper way > loader.scm: installed-modules.scm > @@ -76,6 +76,6 @@ > $(ECHO) "(require \"manage-modules.scm\") \ > (generate-loader-scm)" \ > | LIBUIM_VERBOSE=1 LIBUIM_VANILLA=1 LIBUIM_SCM_FILES=$(top_srcdir)/scm LIBUIM_PLUGIN_LIB_DIR=$(top_srcdir)/uim/.libs \ > - $(top_builddir)/uim/uim-sh -B >$@ > + $(top_builddir)/uim/uim-sh -B >$(top_builddir)/scm/$@ > > # $(ECHO) $(ECHO_N) >$@ パッチを当てて試しましたが、結果は変わりませんでした。 -- 山本将也