« Return to Thread: [Squeak-ja: 3770] OLPC-VM ImmX11 パッチ

[Squeak-ja: 3861] Re: OLPC-VM ImmX11 パッチ

by Tsutomu Hiroshima :: Rate this Message:

Reply to Author | View in Thread

廣島です.大島さん,
こんにちは.

>   大島です。
>
>>   新しいVMのオプションで、LC_CTYPEに従って入力するモードをつける必要が
>> あるのではないかと思ってきています。
>
>   これをテストするパッチを作りました。内部的に関数が増えてしまってちょっ
> とかっこ悪いのですが、日本語などを入力するときにはコマンドラインオプショ
> ンを指定するようになっています。
>
>   squeakvm.orgのtrunkのほうの1843以降に入ったと思いますので、UNIXユー
> ザーの皆さんよろしければテストしてみてください。

trunk のコード(rev 1853)を見ました.
互換性のため仕方がないことでしょうが,
x2sqKeyInput が以前のバージョンとなり,
デフォルトでこれが使われるというのは残念です.
堅牢な入力処理が開発されるまでの過渡的な処置であることを願います.

以降,本来 UNIX-VM 開発の ML に英語で投げるべき内容です.ご容赦下さい.

Tcl/Tk の日本語化をされた SRA の ひらの さんは,かつてある掲示板で,
「SingleByte 環境の開発者では何十年たっても国際化入力はできない」
のような意の発言をなさってました.
かく言う私もかつて Perl/Tk(UNIX) の日本語化パッチをネットに流したことがあり
ます.
現在では UTF-8 化されて,日本語表示には問題はなくなりましたが,
今もパッチを当てないと日本語入力は出来ません.

さて,x2sqKeyInput の主要部を引用します.
デバッグコードは取り除いてあるので行番号が飛んでいます.

1763     int count= XmbLookupString(ic, (XKeyPressedEvent *)xevt, string,
sizeof(string), symbolic, &status);
1764     switch (status)
1765       {
1766       case XLookupNone:         /* still composing */
1770         return -1;
1771
1772       case XLookupChars:
1776       case XLookupBoth:
1780         lastKey= (count ? recode(string[0]) : -1);
1784         return lastKey;
1785
1786       case XLookupKeySym:
1790         {
1791           int charCode= translateCode(*symbolic);
1795           if (charCode < 0)
1796             return -1;  /* unknown key */
1797           if ((charCode == 127) && mapDelBs)
1798             charCode= 8;
1799           return lastKey= charCode;
1800         }
1801
1802       default:
1803         fprintf(stderr, "this cannot happen\n");
1804         return lastKey= -1;
1805       }
1806     return lastKey= -1;
1807   }

XmbLookupString はバッファ string に入力バイト列を埋めて返りますが,
1780 行目でその最初のバイトを残して後は捨てています.
SingleByte の環境が前提の処理であり XmbLookupString を使う意味はありません.

x2sqKeyPlain と比較します.
これは国際化入力モジュールの初期化が出来ない場合か,
オプション -nointl を指定したときに使われる関数です.

1957 static int x2sqKeyPlain(XKeyEvent *xevt, KeySym *symbolic)
1958 {
1959   unsigned char buf[32];
1960   int nConv= XLookupString(xevt, (char *)buf, sizeof(buf), symbolic, 0);
1961   int charCode= buf[0];
1966   if (nConv == 0 && (charCode= translateCode(*symbolic)) < 0)
1967     return -1;  /* unknown key */
1968   if ((charCode == 127) && mapDelBs)
1969     charCode= 8;
1970   if (charCode > 256) /* ALT+?? */
1971     {
1972       modifierState= charCode >> 8;
1973       charCode &= 0xff;
1974     }
1975   return recode(charCode);
1976 }

x2sqKeyInput が前段で入力モジュールの初期化を試みる点と,
入力文字列の問い合わせに使用する X 関数( 1763, 1960 行目 )が違っています.
この XmbLookupString / XLookupString の動作は SingleByte 環境ではほぼ同じで
す.

こちらも XLookupString が埋めた入力バイト列 buf のうち,
最初のバイトだけを 1961 行目で取り出し,他は捨てています.

SingleByte 環境であれば x2sqKeyInput と x2sqKeyPlain の結果は変わりません.

MultiByte 環境では
x2sqKeyPlain では国際化入力モジュールが開かないし,
x2sqKeyInput では MultyByte 文字の最初のバイトしか送られないため,
m17n の image ではパニックになります.

大島さんの発言にあった,

> OLPCでないFedoraではスペイン語配列にしたときにnにチルダ
> がついた文字を入力したときに、余計なバイトも付いてきてしまいます。

> これは、VMにはすでに0xF1の文字が一文字だけ来ているのでしょうか

は,きっと SingleByte 環境 + SingleByte を期待する image を前提とした話です
ね.

スペイン語でも文字コードが utf8 な環境 LC_CTYPE=es_ES.utf8 では,
XmbLookupString は �D+P を 2バイト として扱うので,
x2sqKeyInput の実装では問題となるはずです.
/* Fedora はどのロケールでもデフォルトは utf8 でしょうか? */

要するに,x2sqKeyInput は,
SingleByte 環境では x2sqKeyPlain と動作が変わらず,
MultiByte 環境では害になるので,
これを使う意味は無いはずなのです.

長文になりましたので,続き(?)は回を改めて投稿します.
=======
廣島 勉

 « Return to Thread: [Squeak-ja: 3770] OLPC-VM ImmX11 パッチ