• 締切済み

【Perl/Tk】Photo メソッド に渡すファイル名に2バイト文字コードを指定するには?

Windows-XP上で、ActivePerl This is perl, v5.8.6 built for MSWin32-x86-multi-thread を使用しています。 次のようなPerl/Tk スクリプトで、例えば、デスクトップ上にあるJPG画像ファイルを キャンバスに表示させようとしますが、2バイト文字コードを含むファイル名やパス名だとエラーが出て上手く行きません。 use Tk; use Tk::JPEG; my $fn = $ARGV[0]; my $mw = MainWindow->new; my $cv = $mw->Canvas()->pack(); if(-e $fn){ my $ph = $mw->Photo(-format=>'jpeg',-file=>$fn); $cv->createImage(64,64,-image=>$ph); } MainLoop; ------------------------------------------------- エラー例: Cannot open 'C:\Documents and Settings\guest\テつデテつステつクテつトテつッテつプ\aaa.jpg' in mode 'r' at C:\Perl\site\lib/Tk/Image.pm line 21. 2バイト文字コードを含まないファイル名(例:C:\aaa.jpg)などを指定した場合は、 無事にキャンバスに画像が表示されています。 また、ファイル名に2バイト文字コードが含まれる場合でも、 ifの判定文でファイル存在確認が機能していますので、 Photoメソッド側の問題と思われるのですが、 他に、このファイル名をutf8やeucjpへencode/decodeしてみるなど色々なパターンで試してみたのですが、 どうやってもエラーになってしまいます。 Photoメソッドには、そもそも2バイト文字コードを含むファイル名の利用は出来ない仕様でしょうか。 その他、よい回避方法などがありましたら、お教えください。 よろしくお願い致します。

みんなの回答

回答No.1

何かおかしい。 cygwin perl => NG (Encode とか使ってもダメ) centos perl => OK 一旦、テンポラリファイルにコピーすればとりあえず表示はできる。。。 --- use Tk; use Tk::JPEG; use File::Copy qw(copy); use File::Temp qw(tempfile); use constant TMP_DIR => './'; my $file = shift || die "Usage: $0 file"; if ( !-r $file ) { die "Can't read $file"; } my ( $fh, $tmp_file ) = tempfile( 'tmpfile_XXXX', DIR => TMP_DIR ); close $fh or die "$!:$file"; copy( $file, $tmp_file ) or die "$!:copy $file to $tmp_file"; my $mw = MainWindow->new; my $canvas = $mw->Canvas()->pack(); my $ph = $mw->Photo( -format => 'jpeg', -file => $tmp_file ); unlink $tmp_file; $canvas->createImage( 64, 64, -image => $ph ); MainLoop;

goku3
質問者

お礼

ご回答ありがとうございました。 頂いたスクリプトは、2バイト文字コードを含まないような ファイル( $tmp_file )に一時コピーする方法ということですね。 とりあえず、この方法で凌いでみます。 ただ、向学のため、あくまでも2バイトの文字コードが入った名前 のまま扱う方法が分かれば、それもありがたいです。

すると、全ての回答が全文表示されます。

関連するQ&A