作者: Atsushi SHICHI
日時: 2002/8/10(23:47)
こんばんは、しちです。

#この話題にご興味の無い TSperl の皆さま、ごめんなさい。
#あと少しで解決できそうな気がします。

At Sat, 10 Aug 2002 05:35:44 +0900,
Atsushi SHICHI <ats7@...> wrote:

> > $ perl -MTk -e \
> > 'MainWindow->new->Scale(-label => "Scale Widget")->pack; MainLoop;'
> > 
> > とラベルを指定すると、ウィンドウには「SaeWde」と1文字おき
> > に表示され、日本語を指定すると化けるようになりました。^^;
> 
> こちらの問題は改善しませんでした。

もう少し調べてみました。
まず、各ウィジェットの日本語対応を確認しようと思い、手元にあった
LinuxJapan 2001年8月号の須栗さん(^^)が書かれた Perl/Tk 特集の
サンプルスクリプトが -text や -label に日本語が使われていて丁度
良かったので、利用させて頂きました。
日本語表示を確認したのは、以下のウィジェットです。

Button, Canvas, Checkbutton, Compound, Label, Entry, Radiobutton,
Menu, Menubutton, Message, Text, TextUndo, Tree

日本語に対応しているウィジェットを調べることで、廣島さんのパッチの
内容を理解するのに役立つかも、と思ったのですが、まだ全然理解できて
いません…。

次に、tkUnixFont.c の中にデバッグ情報を表示する部分があったので
Tk800.024/Makefile.PL の Tk::MMutil::TkExtMakefile{'DEFINE'} に
-DUNIXFONT_DEBUG を付け加えてリビルド/インストールし、デバッグ
情報を出力するようにしてみました。
因みに、引用したデバッグ情報を出力している箇所は、tkUnixFont.c の
2014行目辺りです。

まず、正常に動作する Button ウィジェットを使ったスクリプトと、
出力されたデバッグ情報の中で関係ありそうな部分を引用します。

--^ ptk_button.pl
#!/usr/bin/perl -w
use Tk;

MainWindow->new->Button(-text => "あいうえか")->pack;
MainLoop;
--$

==== ログ ここから ====
debug: item [00000, 00000] 'x2422', 0x7fffb070
debug: item [00000, 00001] 'x2424', 0x7fffb072
debug: item [00000, 00002] 'x2426', 0x7fffb074
debug: item [00000, 00003] 'x2428', 0x7fffb076
debug: item [00000, 00004] 'x242b', 0x7fffb078
==== ログ ここまで ====

次に、文字化けを起こす Scale ウィジェットを使ったスクリプトと、
ログを引用します。

--^ ptk_scale.pl
#!/usr/bin/perl -w
use Tk;

MainWindow->new->Scale(-label => "あいうえか")->pack;
MainLoop;
--$

==== ログ ここから ====
debug: item [00000, 00000] 'x2224', 0x7fffaef8
debug: item [00000, 00001] 'x2424', 0x7fffaefa
debug: item [00000, 00002] 'x2624', 0x7fffaefc
debug: item [00000, 00003] 'x2824', 0x7fffaefe
debug: item [00000, 00004] 'x2b24', 0x7fffaf00
==== ログ ここまで ====

この2つのログを見比べると、Scale ウィジェットの方では、例えば
「あ」を表す 0x2422 の1バイト目と2バイト目が反転して 0x2224 に
なっている事が分かります。「い」は反転しても 0x2424 になるので、
ウィンドウには化けた文字に混じって「い」が表示されました。

また、上記のスクリプトで -label => "abcde" とした場合のログは
以下のようになり、ウィンドウには「ace」と表示されました。

==== ログ ここから ====
debug: item [00000, 00000] 'x0061', 0x7fffaef8
debug: item [00000, 00001] 'x0063', 0x7fffaefa
debug: item [00000, 00002] 'x0065', 0x7fffaefc
==== ログ ここまで ====

とりあえず、これらの事実を元にもう少し調べてみようと思います。
何かお気付きの点がありましたらご指摘頂けると有難いです。

-- 
Atsushi SHICHI <ats7@...>