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;
ご回答ありがとうございました。
頂いたスクリプトは、2バイト文字コードを含まないような
ファイル( $tmp_file )に一時コピーする方法ということですね。
とりあえず、この方法で凌いでみます。
ただ、向学のため、あくまでも2バイトの文字コードが入った名前
のまま扱う方法が分かれば、それもありがたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Excel(エクセル) マクロのコードを、少しでも削って短くしたい 3 2022/08/30 07:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlのプログラミング 部分入れ...
-
Strawberry Perl for Windows ...
-
アルファベットに付いて質問し...
-
Perlで同じフォルダにある任意...
-
perlでリテラル値はメモリにど...
-
ペプシコーラとコカ・コーラとD...
-
perlをバージョンアップしたら...
-
openした後、closeしないでプロ...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
perlで2次元配列をサブルーチ...
-
perlのrequireの動き方について...
-
perlについての質問
-
Blenderについて
-
Perl の外部モジュールの利用方法
-
perl このテキストファイルを簡...
-
Perlでファイルの末尾から指定...
-
秀丸での一括変換について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
openした後、closeしないでプロ...
-
perlをバージョンアップしたら...
-
INDIRECT 横に再度抽出したい
-
Perl の外部モジュールの利用方法
-
Perlで特定文字列から特定文字...
-
Perlのエラーについてご教授く...
-
bashスクリプト
-
Strawberry Perl for Windows ...
-
perlで2次元配列をサブルーチ...
-
TeraPadエディターの操作方法に...
-
アルファベットに付いて質問し...
-
perlのflock関数でロックをかけ...
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
Wallpaper Engineでおすすめの...
-
Perlで時間の計算
-
perlのrequireの動き方について...
-
perlでリテラル値はメモリにど...
-
画像が表示でnull; this.src
おすすめ情報