Wednesday, July 1, 2009

ActivePerl v5.10 + Windows CP932 (Shift JIS) 日本語ファイル名の扱い

自分用のメモ。

#!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';

として、何も考えなくても良さそう?

No comments:

Post a Comment