• 締切済み

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

  • goku3
  • お礼率78% (97/123)
  • Perl
  • 回答数1
  • ありがとう数3

みんなの回答

回答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

  • Perl/Tk使用時のUTF-8コード文字の表示

    Windows98SE上でActivePerl5.8.0使用です。  #Perlはここ数年愛用していますが、Tkは数日手をつけただけの初心者です 例えば、  print OUT "☆ Hi! ★\n" ; #☆★はUTF-8 のようにファイルにUTF-8コードで書き出すことは可能ですが、 Tkを用いてWindowにUTF-8コードの文字を表示させようとすると失敗します。 例えば、Windowのタイトルを  $top -> title('☆test1★') ; #☆★はUTF-8 とすると、表示は「笘・est1笘・」と文字化けしてしまいます。 Perl/Tkで作成したWindow上でUTF-8コードの文字を表示させる方法は無いでしょうか?

    • ベストアンサー
    • Perl
  • Perlの文字コードを意識したファイルの読み込み方

    perl5.8でファイルを読み込む場合、文字コードを意識した以下のような呼び方("<:euc-jp")があるのですが この方法で読み込んだ$datの中身はperlの内部コード(UTF8)になっているということでしょうか? それとも、普通に("<")で読み込んで$dat = Encode::decode("euc-jp", $dat);とすべきでしょうか? use utf8; use Encode; my $fname = "test.txt"; # 文字コードがEUC-JP my $dat = ""; open(IN, "<:euc-jp", "$fname) or die "open error!"; flock(IN, 2); while(<IN>){ $dat .= $_; } close(IN);

    • ベストアンサー
    • Perl
  • Perl:ファイル名だけ文字化けする

    Perlをいじって2日の者です。 WindowsVistaを使っております。 現在renameを使ってファイル名を変更しようとしています。 現在のファイル名がIDだけで、 Web上にあるそのIDに対応する情報をファイル名に追加しようとしています。 Web上の情報を取得するまではできたのですが、 変数に入れたその情報を、ファイル名に入れようとすると文字化けします。 ただ、その情報をコマンドプロントで扱う時も、テキストへ出力してみても文字化けしません。 文字化けは、文字コードなるものが原因らしいということで、 とりあえずよく見かける「UTF-8」というものにエンコードしてみたところ、 テキストへの出力が、ファイル名へのそれと同様に文字化けしました。 エンコードした上でファイル名に入れようとすると 情報のそのものがないものとして扱われるようになりました。 これはどう解釈すればいいのでしょうか? どうすれば文字化けを解決できるでしょうか?

    • ベストアンサー
    • Perl
  • ファイル出力時、ファイル名が文字化けする

    Windows上から持ってきたファイルのファイル名ををLinux上のperlプログラムでdecode(perlの内部用文字に変換)してから最終的にutf8に変換してファイル出力を行う下記プログラムがあります 下記コードの①のケースで出力したファイルの中身は文字化けしていないです。ところが②のケースで出力した場合、ファイルの中身は文字化けしていないのですがファイル名が文字化けします。 何か良い対策方法ありますでしょうか。 ------------------------------------------------------------- use utf8; use Encode qw(decode encode); $name = decode('cp932', $name); ←$nameはファイル名 $name = encode('utf8', $name); my $outpath = '/sample/test'; ← ①ファイルの中身は文字化けしていない。 my $outpath = '/sample/' . $name; ← ②ファイルの中身は文字化けしていない。ファイル名が文字化け。 opne my $fh '>', $outpath; print $fh $name; close($fh);

    • ベストアンサー
    • Perl
  • perlでファイルを分割してファイル名も出力したい

    >AA A AAA aaaaaaaaaaaaaaa aaaaaaaaaaaa >BBB BB B bbbbbbbbbbbbbbb bbbbbbbbbbbbbbb bbbbbbbbbbbbbb ・ ・ こういった形式でテキストが入った大きいサイズのひとつのファイルを ・ファイル名 AA A AAA ・テキスト内 >AA A AAA aaaaaaaaaaaaaaa aaaaaaaaaaaa ・ファイル名 BBB BB B ・テキスト内 >BBB BB B bbbbbbbbbbbbbbb bbbbbbbbbbbbbbb bbbbbbbbbbbbbb となるように個別に出力させたいのですがどのようにすればよいでしょうか? #!/usr/bin/perl -w use strict; my $first; my $file; $first = 1; open(IN,"分割前ファイル"); foreach(<IN>) { if ( /^>(.*)/ ) { if ($first == 0 ) { close(OUT); } else {$first = 0; } $file = $1; $file =~ s/[\r\n]//; open(OUT,">$file"); } else { print OUT $1; print OUT $_; } } close(IN); このようなプログラムを組んだのですが、出力結果はファイル名についてはいいのですが、テキスト内が思ったようにいきません。 ・ファイル名 AA A AAA ・テキスト内 AA A AAAaaaaaaaaaaaaaaa AA A AAAaaaaaaaaaaaa このような結果になってしまいます。 どなたか対処方をわかるかたがいましたらお願いします。

    • ベストアンサー
    • Perl
  • Perl/Tkで変数名を使って一気にウィジェットを配置できますか

    Perl/Tkでforやforeachを使って、ウィンドウ上にウィジェットを一括配置したいのです。 my $window = new MainWindow; for (my $i=0; $i<10; ++$i) {$window->Entry->pack;} みたいにして一括作成はできるのですが、作ったウィジェットを後で使うために、これらのウィジェット名に名前をつけながら配置したいです。 上記のコードの場合、後から ent1->get; のように参照できるようにしたいと思っております。 こういったことは可能でしょうか。またその方法があれば手順を示していただけると助かります。 詳しい人には馬鹿にされそうな文ですが、 $ent$i = $window->Entry->pack;では駄目でした。。。

    • ベストアンサー
    • Perl
  • ファイル名を正規表現にかける際の文字コードについて

    Windows XP, ActivePerl5.8.8 です。 windows 上にあるファイルの名前に沿ってフォルダに振り分けしたく、 以下のようなコードを書きましたが、 ファイル名に日本語の「ソ」などがある場合に 処理がおかしくなります。 文字コードの問題だと思いますが、どうすれば解決できるでしょうか。 ++++ここからソース++++++ #!c:/perl/bin/perl.exe use 5.008; use strict; use warnings; use File::Basename; use File::Copy; use File::Path; my $newdir = "C:/tmp"; for my $filename ( @ARGV ){ main($filename); print "complete.\n"; } sub main{ my ($filename) = @_; my($basename, $basedir) = fileparse($filename); my($name1, $name2, $ext) = $basename =~ /^(.*) - (.*)(\.[a-zA-Z0-9]+)$/; mkdir "${newdir}/${name1}"; File::Copy::copy( "${filename}", "${newdir}/${name1}/${basename}" ) or die "${filename} : Cannot copy"; } 1;

    • ベストアンサー
    • Perl
  • 文字化けしたファイル名の文字コードを変換するには?

    WinXPのマシンに、ファイル名の文字化けしたzipファイルがあります。 このファイルは元々LinuxマシンにあったのをWindowsへ 転送してきたものなので、EUC-JPで文字化けしてしまっているのだと (私は)思うのですが、合ってるでしょうか? また、これをどうすればWindowsで読めるように変換できるでしょうか? 検索などで調べて、KanjiTranslatorという文字コード変換のフリーソフト を使ってみたのですが、うまくいきませんでした…。 (ファイル名の変換と、ファイルの文字コード変換は違うのでしょうか? 方法をお知りの方いましたら、教えていただけないでしょうか? よろしくお願い致します。

  • MS-DOSの2バイト文字のファイル名が扱えない

    10年以上前にPC-9801のMS-DOS 3.1 で作成したテキストファイルを フロッピィ経由で WindowsXP Home Edition Version 2002 Service Pack 2 にコピーしようとしました。 ファイル名が1バイト文字のみのものや 2バイト文字でも漢字の場合は問題なくコピーできました。 ところが「α(ギリシア文字アルファ)」や「m(全角ローマ字小文字エム)」で始まるファイル名のものは  ファイルまたはフォルダのコピー エラー  ファイルをコピーできません。送り側のファイルまたはディスクから読み取れません。  OK というウィンドウが出てきてコピーできません。 (コマンドプロンプトでやっても同様です。) 仕方が無いので、PC-9801上で一度1バイト文字のファイル名にRENAMEし、Windows上にコピーし終えてからWindows上でファイル名をαやmに直すという作業をしています。 ワークアラウンドとしては十分ですが、そういったファイルが大量にあるのでとても面倒です。 なんでこんな仕様になってるのでしょうか? どこかの設定を変えることで、 MS-DOSで作成されたαやmで始まるファイルをそのまま扱うようにできないでしょうか。

  • perlでファイルの拡張子を除いた文字列の取得

    perlでファイルの拡張子を除いた文字列を取得するにはどうすればいいんでしょうか? foo.txt --> foo aaa.pl --> aaa splitを使用して @array = split(/./,<filename>) $value = $array[0] としてもうまく取得できないんですが。。 よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう