作者: Koichi
日時: 2005/5/05(12:58)
こんにちは、樋口です。

私が主に試しているのは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");
}