アプリ版:「スタンプのみでお礼する」機能のリリースについて

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バイト文字コードを含むファイル名の利用は出来ない仕様でしょうか。
その他、よい回避方法などがありましたら、お教えください。
よろしくお願い致します。

A 回答 (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;
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
頂いたスクリプトは、2バイト文字コードを含まないような
ファイル( $tmp_file )に一時コピーする方法ということですね。
とりあえず、この方法で凌いでみます。

ただ、向学のため、あくまでも2バイトの文字コードが入った名前
のまま扱う方法が分かれば、それもありがたいです。

お礼日時:2009/12/08 00:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!