2010/08/12

おつかれですか

NHKの影山解説委員、首吊り自殺図り重体(産経新聞) - Yahoo!ニュース

聞いたことのある名前が出てきたのでちょっと驚きでした。

それはそれとして。
ちょっと訳あってcp936(簡体字中国語 GBK)かcp932のどちらが入ってきてもunicodeにデコードできるスクリプトを作っていたんですが、perlに含まれているEncode::Guessではcp936の文章を見分けることは出来ても、cp932の文章をcp932か936かと見分けることは難しいっぽく?大抵"cp936 or cp932"という玉虫色な回答を返してきます。
そこでどちらかが駄目だったらもう片方、という処理をさせようとおもいました。
僕は日本人なので日本語のみを試してからデコードできなければ中国語も試すのが正しいような気がするのですが、何故かcp932しか指定しないとcp936の文章をcp932と誤認してしまうことがあったため先に両方判定させてから絞りきれなかったら日本語のみ、としています。
そんなこんなで、入力が$data、出力が$data_utf8なperlスクリプト↓を作ってみました。

忘れないように、メモ。

my $decoder = guess_encoding($data, qw/euc-jp cp932 iso-2022-jp big5-eten cp-936 gb12345-raw gb2312-raw/);
if(! ref($decoder)){
$decoder = guess_encoding($data, qw/euc-jp cp932 iso-2022-jp/);
};
(! ref($decoder)) and die "can't guess encode of $ARGV[0]: $!\n";
my $data_utf8 = $decoder->decode($data);


これをD&Dするとcp932に直して「元のファイル名_SJISという名前」という名前で保存するようなバッチファイル↓と一緒に利用する形態にしてみました。

バッチファイル
setlocal
set program=perl -w "%~dpn0.pl"
:START
@IF %1.==. GOTO QUIT
%program% %1 "%~dpn1_SJIS%~x1"
@IF ERRORLEVEL 1 GOTO ERROR
@SHIFT
@GOTO START

:ERROR
@echo error occurd
@pause
@SHIFT
@GOTO START
:QUIT


perlスクリプト(バッチファイルと同じ名前.pl)
#### 実行環境チェック
#(eval {require Encode}) or die "please use perl 5.8.0 or higher version";
require Encode;
use Encode::Guess; # default only ascii/utf8/BOMed UTF
binmode STDOUT, ":encoding(cp932)";
binmode STDERR, ":encoding(cp932)";
use utf8;

#参考ページ:http://www.kt.rim.or.jp/~kbk/perl-5.8/guess.html http://www.kt.rim.or.jp/~kbk/perl-5.8/supported.html

#### 引数チェック
($ARGV[1] and (!$ARGV[2])) || die "Please input 2 arguments"; #引数が2つなければexit

#### 入出力ファイルチェック
(-r $ARGV[0]) or die "can't open $ARGV[0]: $!\n";
(-w $ARGV[1]) and warn "$ARGV[1] is over written\n";

#### 入力
open(INPUT,$ARGV[0]); #入力OPEN
my $data=join '',<INPUT>;
close(INPUT);

#### UTF8にデコード
my $decoder = guess_encoding($data, qw/euc-jp cp932 iso-2022-jp big5-eten cp-936 gb12345-raw gb2312-raw/);
if(! ref($decoder)){
$decoder = guess_encoding($data, qw/euc-jp cp932 iso-2022-jp/);
};
(! ref($decoder)) and die "can't guess encode of $ARGV[0]: $!\n";
my $data_utf8 = $decoder->decode($data);

###cp932で出力
open(OUTPUT,'>crlf:encoding(cp932)',$ARGV[1]) or die "can't write: $!\n"; #出力OPEN
print OUTPUT $data_utf8;
close(OUTPUT);

参考ページも埋め込んでいます

0 件のコメント:

コメントを投稿