Windows 版 ActivePerl 5.8.X で日本語のファイル名を使う。

結論から言うと、UTF-8を内部コードにしているとき、Windows で日本語ファイル名を使いたいときは、プログラムの頭でこんな風に宣言すると便利である。
use strict;
use encoding 'shiftjis';
use open ':encoding(shiftjis)';
use open ':std';
use File::Spec::Functions;

use subs qw(open);
sub open {
  use Encode;
  return CORE::open(shift,encode('shiftjis',shift),encode('shiftjis',shift));
}


Perl 5.8.X では内部コードに UTF-8が使える。しかし、そのために日本語のファイル名が正しく扱えないことがある。
たとえば、次のプログラムは何の問題もなく動作する。
use strict;
use File::Spec::Functions;
my $dirname = catfile('c:','data');
my $filename = '日本語ファイル名.txt';
my $filepath = catfile($dirname,$filename);
open(my $fout,">",$filepath) or die "$filename をオープンできません\n";
print $fout '日本語、日本語',"\n";
close($fout);

しかし、Windows版 ActivePerl 5.8.X 日本語テキストファイルの操作 で取り上げたように、日本語文字列をUTF-8で扱うように書き直したとする。
use strict;
use encoding 'shiftjis';
use open ':encoding(shiftjis)';
use open ':std';

use Encode;
use File::Spec::Functions;

my $dirname = catfile('c:','data');
my $filename = '日本語ファイル名.txt';
my $filepath = catfile($dirname,$filename);
open(my $fout,">",$filepath) or die "$filename をオープンできません\n";
print $fout '日本語、日本語',"\n";
close($fout);

c:\data を表示すると化けてしまう。
画像

なんちゅうことはない。文字コードをUTF-8のまま、Windows システムにファイル名を渡しているからである。ファイルを open するときにShiftJISへ変換してやればいい。プログラムの頭ぐらいで use Encode; 宣言して、open のところを、次のように書き換える。

open(my $fout,">",encode('sjis',$filepath)) or die "$filename をオープンできません\n";

もう一回やってみると、めでたし、めでたし。
画像

しかし、他人の書いた無造作に open を多用しているプログラムとか UTF-8対応に書き直すときは、open文を探すのは面倒だし忘れる。そこで、open文をオーバーライトしてしまうと楽だと思う。最初に出てきたプログラムを書き直すとこんな感じになる。
use strict;
use encoding 'shiftjis';
use open ':encoding(shiftjis)';
use open ':std';
use File::Spec::Functions;

use subs qw(open);
sub open {
  use Encode;
  return CORE::open(shift,encode('shiftjis',shift),encode('shiftjis',shift));
}

my $dirname = catfile('c:','data');
my $filename = '日本語ファイル名.txt';
my $filepath = catfile($dirname,$filename);
open(my $fout,">",$filepath) or die "$filename をオープンできません\n";
print $fout '日本語、日本語',"\n";
close($fout);



このプログラムの中では、独自の open 関数を作って、日本語の文字列が指定される可能性のある、第2引数と第3引数を shiftjis に変換して、もともとのPerl の関数である CORE::open を呼び出している。もっと汎用的にかけるはずだけど、本題からはずれるので、今日はここまで。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 2

かわいい かわいい

この記事へのコメント

この記事へのトラックバック