macのターミナルで、日本語の引数をとるperlスクリプトを使う

概説

文字コードの問題は非常に頭が痛くて、いまだに良く分かっていないんだが、The Rule of Thumbは、use utf8して、内部ではすべてunf8で取り扱って、Encodeモジュールをつかって出入力のときに、外部との整合性をつける、というものだ。
参考:http://www.rwds.net/kuroita/program/Perl_unicode.html
まあそれはそれで良いのだが、Macのターミナルで日本語の引数を取るときにどうしたら良いのだろう、と思っていた。で、それを確認して対処したのでメモを残しておく。

ターミナルで引数を日本語で入力するとどうなっているの?

ターミナルで日本語でかいた文字は、実際にはユニコードの文字列として、perlに送られる。その確認は、例えば下のコードを実行すると分かる。

perl test.pl 今日もいい天気ですね

test.plの中身

#! usr/bin/local/perl
use Encode::Guess;
use utf8;

my $temp = shift;

my $enc = guess_encoding($temp, qw/euc-jp shiftjis 7bit-jis utf8/);
print $enc->name, "\n";

問題は、このユニコードの文字列には、フラグがついてないということ。つまり、実際にはユニコードの文字列なのにperlがそう認識しないので、マッチングしたりするときにうまく動かない(フラグがどういうものかについては、上記リンク参照。まあ要するに、同じ文字列があったとしてフラグがついている場合とない場合では、内部的には別物として扱われてしまう。)

じゃあどうすれば良いの?

当たり前といえば当たり前だが、ユニコードのフラグをつけてやれば良い。だいたいこんな感じ。

#! usr/bin/local/perl
use Encode;
use utf8;
my $temp = shift;
$temp = Encode::decode("utf8", $temp);

最後の行は何をしているかというと、perlに$tempの文字コードがutf8であることを教え、フラグ無しのutf8からフラグ付きのutf8の文字列に変換している。普段そんなに意識しないが、decodeは文字コードの変換だけではなく、フラグ付けもしている。