2009年8月11日火曜日

とりあえず上手くいくperl5.8のエンコード指定テンプレ

正規表現がまともに動いて、文字化けもしない設定がわかってきたのでメモ。
下は簡単な検索置換スクリプトサンプルです。
#!/usr/bin/perl;

use strict;
use warnings;
use utf8; # ソースコード(このスクリプト自体)をUTF8で書くよという宣言
use Encode; # Encode.pm モジュールを使用する宣言

binmode STDIN, ':encoding(utf8)';
binmode STDOUT, ':encoding(utf8)';
binmode STDERR, ':encoding(utf8)';
# 標準出力(コンソールから打ち込む文字、または
# ブラウザから送られてくる文字)のエンコード指定。
# binmode はバイナリモード。
# Windowsのコマンドプロンプトに出すならば ':encoding(cp932)' を使う。

if(@ARGV < 2){
print "Usage: perl test.pl infile outfile\n";
exit;
};

my $INFILE=$ARGV[0];
my $OUTFILE=$ARGV[1];

open my $in, "<:encoding(cp932)", $INFILE or die "$!";
# 読み込み時にかならずファイルのエンコードを指定。
# これで読み込んだ文字に「UTF8フラグ」が立つ。
my @file = <$in>;
close($in);

foreach my $line (@file){
$line =~ s/わらつたよ/うたつたよ/g;
$line =~ s/かぷかぷ/ボェ〜〜〜〜〜と/g;
$line =~ s/クラムボン/ジャイアン/g;
};

open my $out, ">:encoding(utf8)", $OUTFILE or die "$!";
# 書き出す時もかならずエンコードを指定する。
# 「UTF8フラグ」もきちんと取って出力される。
print $out @file;
close($out);


これで、コンソールから
$ perl test.pl infile.txt outfile.txt

を実行すると、WINDOWS shift-jis で書かれた infile.txt
『クラムボンはわらつたよ。』
『クラムボンはかぷかぷわらつたよ。』
『クラムボンは跳てわらつたよ。』
『クラムボンはかぷかぷわらつたよ。』

を読み込んで、UTF8 の outfile.txt
『ジャイアンはうたつたよ。』
『ジャイアンはボェ〜〜〜〜〜とうたつたよ。』
『ジャイアンは跳てうたつたよ。』
『ジャイアンはボェ〜〜〜〜〜とうたつたよ。』
を吐き出します。

結局
  • ソースファイルはUTF8で書き、use utf8を指定
  • 標準出力にbinmodeでエンコードを指定
  • 読み込み、書き出し時にファイルのエンコードを指定

これを守って書けばたいていは上手くいきそうです。
自分用コピペ元として…。

参考:
404 Blog Not Found:perl - Encode 入門
Perl5.8 の UNICODE 対応
WindowsでPerlを使うもんじゃない
Perl: use utf8 と use encoding と \w - えむもじら

0 件のコメント: