自分用のメモ。
#!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 件のコメント:
コメントを投稿