廣島です.大島さん,
こんにちは.
> 大島です。
>
>> 新しい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 環境では害になるので,
これを使う意味は無いはずなのです.
長文になりましたので,続き(?)は回を改めて投稿します.
=======
廣島 勉