[Anthy-dev 1840] Re: uim-0.4.6alpha on Solaris8

アーカイブの一覧に戻る

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) >$@

パッチを当てて試しましたが、結果は変わりませんでした。

-- 
山本将也



Anthy-dev メーリングリストの案内
アーカイブの一覧に戻る