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

Back to archive index

YamaKen yamak****@bp*****
2005年 2月 15日 (火) 22:25:49 JST


At Tue, 15 Feb 2005 21:53:17 +0900,
h0131****@ice***** wrote:
> 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できているようです。
(snip)
> 調べてみたら原因がわかりました。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"というように
> する予定なんですが。

iconv_open(3)が正しく解釈できる名前を渡す必要があります。今uim.h
を見てみましたがその記述が欠落していますね。追加しておきます。

私の手元のiconv_openのマニュアルでは以下のように記述されています
が、非標準の"euc-jp"も"EUC-JP"として解釈しているんだと思います。
これに対して山本さんの環境のiconv_openは"euc-jp"を解さなかったと
いう事じゃないかと思います。

       The values permitted for fromcode and tocode and the supported combina-
       tions are system dependent. For the  libiconv  library,  the  following
       encodings are supported, in all combinations.

       Japanese
              EUC-JP,   SHIFT_JIS,    CP932,    ISO-2022-JP,    ISO-2022-JP-2,
              ISO-2022-JP-1

というわけで、以下のコードで環境変数から取得したencodingを使う場
合はiconv_open(3)が受け入れ可能な文字列に正規化する必要があると
思います。

> 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";
> }

-------------------------------
ヤマケン yamak****@bp*****



Anthy-dev メーリングリストの案内
Back to archive index