こんにちは、樋口です。
私が主に試しているのはActivePerlなのですが、現状ではTk(804)に日本語を
渡す際に、「utf8 flag」を付与する必要があるようです。
Jcode->new('ほげ')->utf8のようにしてからTkに渡しても、確かに文字化けし
ました。そんなわけで、やむをえずEncode.pmを使っています。
# これのおかげで、文字化けを引き起こすようなスクリプトをデバッグする
# のが面倒になった気がします。変数に「utf8 flag」がついているかどうか
# はprintしただけではわからないようですので…。use encodingして、すべ
# ての変数(?)にutf8 flagをつけてしまえば、楽になるのかもしれませんが…。
さて、本題のLinux(Unix)上でWindowタイトルが文字化けする件ですが、わざ
わざお試しいただいたようで重ね重ね恐縮です。私自身もいろいろと試してみ
た結果、以下のような結果となりました。
------------------------------------------------------------
[FedoraCore 3 / x86-64]
× GNOME 2.8 (ja_JP.UTF-8)
× GNOME 2.8 (ja_JP.eucJP)
× XFce 4.0 (ja_JP.UTF-8)
× XFce 4.0 (ja_JP.eucJP)
× KDE 3.3.1 (ja_JP.UTF-8)
△ KDE 3.3.1 (ja_JP.eucJP)
# ja_JP.eucJPにするとWindow内部が文字化けしました。
# /libと/lib64の兼ね合い(?)でそのままではmakeできず、
# 強引な設定でTkをmakeしているのが原因かと思われます。
[FedoraCore 4 test2 / i386]
× GNOME 2.10 (ja_JP.UTF-8)
× GNOME 2.10 (ja_JP.eucJP)
× KDE 3.4.0 (ja_JP.UTF-8)
○ KDE 3.4.0 (ja_JP.eucJP)
[Vine Linux 3.1 / i386]
× GNOME 2.10 (ja_JP.eucJP)
○ KDE 3.4.0 (ja_JP.eucJP)
[Mac OS X Tiger]
× デフォルトのwm(?) (ja_JP.UTF-8)
------------------------------------------------------------
つまり、ロケールがja_JP.eucJPに設定されたKDEだけで、正常に日本語の
Windowタイトルが表示されるようなのです。
文字化けする場合でも、ターミナル上のロケールを「C」に設定すると、文字
化けの仕方が変わって(?)「\x{307b}\x{3052}」のような文字列が表示されま
す。Tkは、ロケールにあわせてWindowタイトルを表示しようとしているようで
すが、それがあまり上手く行っていないということなのでしょうか。
ただ、KDEでは上手く行くのになぜGNOMEでは駄目なのかという点は、もうひと
つ納得できないのですが、、、ちょっと今回は力尽きてきたような気もします。
以上、中間報告というこで…。
樋口 (http://hey.to/KO-ichi)
p.s.
以下がテストに使っているスクリプトです。
スクリプトはEUCで保存しています。
------------------------------------------------------------
use Tk;
use Jcode;
require Encode if $] > 5.008;
my $mw = MainWindow->new;
&tk_font($mw);
$mw->title( &tk_jchar('日本語') );
$mw->Label(
-text => &tk_jchar('日本語のラベルを表示')
)->pack();
$mw->Entry()->pack();
MainLoop;
# Tkに渡す文字列の作成
sub tk_jchar{
my $str = shift;
if ($] > 5.008){
return Encode::decode('eucjp',$str);
} else {
return Jcode->new($str)->sjis;
}
}
# フォントの設定
sub tk_font{
my $mw = shift;
if ($^O eq 'MSWin32'){
$mw->fontCreate('MyFont',
-family => 'MS UI Gothic',
-size => '10',
);
} else {
$mw->fontCreate('MyFont',
-family => 'goth_p',
-size => '10',
);
}
$mw->optionAdd('*font' => "MyFont");
}