PSLブログ

ヨシナシゴトヲツヅリマス

今頃Encode.pm

私か゛perlに出会った頃はperl4の時代で、レキシカル変数などなかったし(すべてグローバル)、CGIで日本語を扱うには、レスキューさんのサイトを参考にしていた。レスキューさんはMatt's Script Archiveのソースを参考にしているぽかった。私の初期のソースはMattさんのまねのまねというようなシロモノである。

Sjift-JISコードというのは、2バイト目にメタ文字が来るので、ダブルクォーテーションの中でメタ文字が解釈されてしまうといろいろな文字化けが起こった。そこで、プログラムはeuc-jpで書くようになった。仕事としてはこの時代が長い。このサイトで公開しているプログラムは、いまだShift-JISである。

そこでUTF-8である。とっくに主流となっていて、私の仕事でも、FORM MAILERで使用するフォームの支給がUTF-8で来るので、UTF-8のままhtmlの表示とフォームデータの受取りはUTF-8に対応しつつ、内部コードをShift-JISのままでやり過ごしている。これは結構苦しくて、Shift-JIS(cp932)で表される文字でないと実質扱えない。これからはソースの文字コードをutf8にしていく予定である。

今まで見向きもしなかったEncode.pmを試してみた。use utf8;を宣言して、バイト列をデコードして内部コードに変換、アウトプットはencodeするというのは分かったが、今試しに丸数字や(株)のような特殊文字をShift-JISで保存しておいて、それを読み込んでeuc-jpやiso-2022-jpに書き出すということをやってみたのだが、変換されない。utf8に出力したものだけは再現された。

sjis.txtの中身

1~2①3㎡㈱髙ⅲ

utf.pl

use strict;
use warnings;
use utf8;
use Encode;
my $fh;

open(my $fh, "<", "sjis.txt");
my $sjis = join("", <$fh>);
close($fh);

open($fh, ">", "euc.txt");
print $fh encode('eucjp', decode('cp932', $sjis));
close($fh);

open($fh, ">", "utf8.txt");
print $fh encode('utf8', decode('cp932', $sjis));
close($fh);

open($fh, ">", "iso2022jp.txt");
print $fh encode('iso-2022-jp', decode('cp932', $sjis));
close($fh);

euc.txtの中身

1?2?3????

utf8.txtの中身

1~2①3㎡㈱髙ⅲ

iso2022jp.txtの中身

1?2?3????

うーんうまくいかない。Encodeは変換がシビアというウワサを聞いてはいたが、このままでは使えない。Pure PerlUnicode::Japaneseの方が便利とか思ってしまう。続きはまたにしよう。