Tag Archives: shift_jis

Perl 5.8 & I18N

最近、久々にPerlを使い、バージョン5.8を使ったのですが、昔のPerlと比べるとずい分と変わっているところも多く、文字列まわりでちょっと混乱し、ハマってしまったので、わかっている人には無駄な情報と思いますが、Perl 5.8の初心者の人等、それなりに役に立つこともあるかと思いまとめてみました。 例えば、下記のコードは、いわゆる日本語環境下では、何の問題もなく期待した通りに「日本語」という文字列が表示されます。 $string = “日本語”; print $string; で、普通はこれでいいように思うのですが、例えば、UTF-8でファイルに書き出したいと思って、下記のようなコードを実行し、作成されたtest.txtファイルを開いて見ると、見事に文字化けします。 open (OUT, “>:utf8”, “test.txt”) || die “Can’t open test.txt: $!\n”; $string = “日本語”; print $string; print OUT $string; close OUT; 私の場合、英語版のWindows XPで日本語ロケールを設定して使っているので、そのためにこういう問題が起きるのかと最初に思ってしまいました。特に、ほぼすべてのアプリケーションで日本語を表示できるようにするために、システムロケールは日本語にしてあるのですが、米国での使用を前提としたアプリケーションも同時に使うためにユーザロケールは英語(米国)に設定しているので、余計にそう思ったのですが、すべて日本語ロケールに設定しても、日本語版のWindows 2003で試しても同様の結果でしたので、Perl自体の実装の問題(というか仕様)であると思います。 この環境下でも上記の何の変哲もないコードは正常に実行され、「日本語」という文字列が表示されます。しかし、それはたまたまであって内部的には、実はガベージイン・ガベージアウトが行われているのです。Javaのようにソースコードファイルがどのエンコーディングかを指定できるようにするのが本来は筋なのだと思うのですが、Perlの場合は、そういう指定ができるのはutf8を使うかどうかという指定(use utf8を頭に書く)だけが存在し、将来はUTF-8で一本化する方針のため(use utf8もなくす)、シフトJIS等でソースを作成することは正式にはサポートしないという立場のようです。で、上記のようにシフトJISで保存したファイル内のリテラル文字は、適当なバイト列として内部的には扱われてしまうようで(UTF-8になっているわけでもない様子)、文字列に対する操作やコード変換を伴う入出力を行わない限りは、その事実に気付かないということになります。 この場合、主に2つの方法があります。一つ目は、use utf8を宣言して、ファイル自体をUTF-8で保存し、Perl外部との入出力には適切なエンコーディング情報を指定してあげる方法です。コードは、大体次のようになります。 use utf8; open … Continue reading

Posted in コンピュータ | Tagged , , , , , , , , , , , , , , , | Leave a comment