[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:31393] tcl/tk8.0-jp と X window system のコピー & ペースト機能について



菊地ともうします。
woodyを使わせて頂いています。
以前、
●「tcl/tk8.0-jpを使ったテキストエディターから、X window system の機能での
、コピー&ペーストで、tcl/tk8.0-jpを使っていない他のソフトへペーストを行う
と、行の始めから、かな漢字の文字コードがあるまでの左側の英数字の文字コード
がカットされる」という問題を報告させて頂きました。
その件で問題解決のヒントになるかもしれない事を発見しましたので、お知らせい
たします。

tk8.0jp_patch作成
というディレクトリー名をtkesk-jaから、X window system のコピー&ペーストの
機能で、KRxvt にペーストすると、下記のようになってしまいます。

tk8.0jp_patch)B作成

つまり、漢字の前に、)Bというコードが添付されている。
kterm や XTerm(Unicode) では正常に、ぺーストされました。
それで、以前は、これは、KRxvt の問題だと思っていました。
しかし、tkmemo でも同じことが起こり、もしかしてと思って、gmc を使ってそこ
から、

tk8.0jp_patch作成

というディレクトリー名を KRxvt にペーストしてみました。
すると、正常に、ペーストできました。
すると、今度は、

tk8.0jp_patch)B作成

の漢字の前に、)Bというコードには、意味のある情報である可能性が出て来ました
。つまり、コピーして来たコード自体の"おかしさ"の情報源である可能性がありま
した。

tcltk8.0-ja-8.0.4jp1.3における
internalCode というものも、どの部分の"内部"なのかも判っていませんが、
tcltk8.0-ja-8.0.4jp1.3/tcl8.0-ja-8.0.4jp1.3/Incompat80jp
この文章の文脈からすると、
スクリプト(文章から、そう表現するようです。)の中でのコードの事だと推測しま
した。まちかっているかもしれません。その internalCode は EUC になっている
ようです。しかし、
tcltk8.0-ja-8.0.4jp1.3/tk8.0-ja-8.0.4jp1.3/generic/tkCtext.c
の中の下記をみると、

/*
 *--------------------------------------------------------------
 *
 * convJWStoCT --
 *
 *	Convert Japanese wide character string (type wchar) to
 *	Compound Text string and returns its length.
 *
 * Results:
 *	The return value is the length of the converted string
 *	(excluding trailing NUL byte).
 *	The converted string is written in the area specified
 *	by xstr.  It is the caller's responsibility to allocate
 *	appropriate size of memory for xstr.
 *	If xstr is NULL, the converted string is not written,
 *	only the length of the string is returned.  So calling
 *	with xstr NULL is useful for determining the size of
 *	required storage.
 *
 * Side effects:
 *	None. 
 *
 *--------------------------------------------------------------
 */

static int
convJWStoCT(wstr, len, xstr)
wchar *wstr;
int len;
unsigned char *xstr;
{
    int g1;
    int n = 0;
    
    /*
     * G0, G1 usage:
     *  G0: ASCII
     *  G1: Kanji or Kana
     */
    
    /* COMPOUND_TEXT initial value -- ISO8859-1 */
    g1 = CS96|'A';
    
    if (len < 0) {
	wchar *t = wstr;
	len = 0;
	while (*t++ != 0) len++;
    }

    while (len-- > 0) {
	int c = *wstr++;

	switch (c & 0x8080) {
	case 0:		/* ASCII or C0 or DEL */
	    if (c < ' ' || c == 0x7f) {
		/* C0 or DEL */
		if (c == '\t' || c == '\n') {
		    if (xstr) *xstr++ = c;
		    n++;
		}
		break;
	    }
	    if (xstr) *xstr++ = c & 0x7f;
	    n++;
	    break;
	case 0x80:	/* Kana (JIS-X0201 right half) or C1 */
	    if (c < 0xa0 || 0xfe < c) break;
	    if (g1 != 'I') {
		if (xstr) {
		    *xstr++ = '\033';
		    *xstr++ = ')';
		    *xstr++ = 'I';
		}
		n += 3;
		g1 = 'I';
	    }
	    if (xstr) *xstr++ = c & 0xff;
	    n++;
	    break;
	case 0x8080:	/* Kanji (JIS-X0208) */
	    if (g1 != (MBCS|'B')) {
		if (xstr) {
		    *xstr++ = '\033';
		    *xstr++ = '$';
		    *xstr++ = ')';
		    *xstr++ = 'B';
		}
		n += 4;
		g1 = MBCS|'B';
	    }
	    if (xstr) {
		*xstr++ = (c >> 8) & 0xff;
		*xstr++ = c & 0xff;
	    }
	    n += 2;
	    break;
	default:
	    /* ignore G3 characters (undefined) */
	    break;
	}
    }

    /*
     * reset G1 to the default character set
     */
    if (g1 != (CS96|'A')) {
	if (xstr) {
	    *xstr++ = '\033';
	    *xstr++ = '-';
	    *xstr++ = 'A';
	}
	n += 3;
    }

    if (xstr) *xstr = '\0';
    return n;
}

のように、
	case 0x8080:	/* Kanji (JIS-X0208) */
	    if (g1 != (MBCS|'B')) {
		if (xstr) {
		    *xstr++ = '\033';
		    *xstr++ = '$';
		    *xstr++ = ')';
		    *xstr++ = 'B';
		}
ここの中に、
		    *xstr++ = '\033';
		    *xstr++ = '$';
		    *xstr++ = ')';
		    *xstr++ = 'B';
と、) と B とを見付けました。
つまり、tk8.0jp_patch)B作成 の中の )B はこれではないのか?
私は、基本的には、C言語でもプログラムを組めない初心者です。
それでも、勉強のつもりで、上記の )B をキーワードにして、
「Linux/FreeBSD日本語環境の構築と活用」という本で調べました。すると、あり
ました。"Compound Text"というコードの記述の中にありました。
すると、上記のソースコードの中の各部分の記述から推測すると、Compound Text
への変換をしていることが推測できました。

この部分が全体の中でどう使われているかを調べることは、私には、無理ですが、
推測すると、今回の問題のtkdesk-jaのテキストエディター上やtkmemo、
tcltk8.0-ja-8.0.4jp1.3を使ったソフトでは、全て、内部では、文字コードを
"Compound Text" に変換して持っているのではないでしょうか? ですから、X
window system のコピー&ペーストの機能で、コピーしても、"Compound Text" の
コードがコピーされて、それをペーストしても、"Compound Text" のコードを扱え
るソフトだけが正しく解釈できて、正しくペーストを完了できる、そうでないソフ
トでは正しくペーストできない、ということではないでしょうか?

私にできるのは、ここまでだとおもいます。この問題は回避することは可能でしょ
うか?EUCの環境では、内部のデータはEUCで持っている状態にするように改造する
ことは大変なことになるのでしょうか? もしかすると、これだけで、問題が解決
する可能性もあります。現状では、tcltk8.0-ja-8.0.4jp1.3を使ったソフトでは、
それ以外のソフトへ、X window system のコピー&ペーストの機能を使えないとい
うことになると思います。

もし、この推測が正しいのでしたら、tcltk の日本語版の作者の方への連絡は私に
もできますので、メールでの連絡はしようと思います。

コメントをよろしくお願いします。