自分用のメモ。
#!perl # -*- mode: cperl; coding: utf-8-dos; -*- # # JapaneseFileName.pl # ActivePerl v5.10 + Windows CP932 (Shift JIS) 日本語ファイル名の扱い # use 5.010; use utf8; use strict; use warnings; use Encode; use IO::File; # コマンドプロンプトで標準入出力・エラー出力を使う場合には、 # エンコーディングをコードページに合わせる binmode $_, ':encoding(CP932):crlf' for qw(STDIN STDOUT STDERR); my $filename_cp932 = shift @ARGV or die "ファイル名指定して"; my $filename = decode('CP932', $filename_cp932); say "ファイル名: $filename"; say "内部形式でテスト: ", -e $filename ? 'あるよ' : 'ないよ'; say "CP932 でテスト: ", -e $filename_cp932 ? 'あるよ' : 'ないよ'; say -f _ ? 'ファイルだよ' : 'ファイルじゃないよ'; say -r _ ? '読めるよ' : '読めないよ'; say -w _ ? '書けるよ' : '書けないよ'; my $fh = IO::File->new($filename_cp932, '>:encoding(CP932):crlf') or die "$!"; $fh->print("CP932で書かれるよ ①~ \\n は CRLF \n"); undef $fh; print "nkf: "; system 'nkf', '--guess', $filename_cp932; print "$ENV{COMSPEC} の type: "; system $ENV{COMSPEC}, '/C', 'type', $filename_cp932; print "$ENV{COMSPEC} の dir: "; system $ENV{COMSPEC}, '/C', 'dir', '/B', $filename_cp932;
コマンドプロンプトでの実行結果
> dir /B "新規テキスト ドキュメント.txt" 新規テキスト ドキュメント.txt > perl JapaneseFileName.pl ".\新規テキスト ドキュメント.txt" ファイル名: .\新規テキスト ドキュメント.txt 内部形式でテスト: ないよ CP932 でテスト: あるよ ファイルだよ 読めるよ 書けるよ nkf: CP932 (CRLF) C:\WINDOWS\system32\cmd.exe の type: CP932で書かれるよ ①~ \n は CRLF C:\WINDOWS\system32\cmd.exe の dir: 新規テキスト ドキュメント.txt >
素直に使えそうで「ほっ」
追記@Fri Jul 03 04:56:35 2009
binmode $_, ':encoding(CP932):crlf' for qw(STDIN STDOUT STDERR);
の代わりに
use open IO => ':encoding(cp932)'; use open ':std';
のほうが良さそうですね。
locale support のある Linux やなんかだと
use open IO => ':locale';
として、何も考えなくても良さそう?
0 件のコメント:
コメントを投稿