perl5.8のUnicodeサポート

perl は 5.8 から Unicode(utf-8) がサポートされました.5.6 でも Unicode に対応はしていましたが,ぜんぜん使い物にならず,ようやく 5.8 でまともに使えるようになったということです.ただせっかく使えるにもかか わらず perldoc などを見てもイマイチ使い方がわからないので,独自にまと めてみたのがこのページです.

誤った書き方や勘違いをしてい ることもあるので,形式的ですがこのページの内容は無保証です.

内容

文字コード変換

とりあえず perl5.8 で新しく組み込まれた機能を見るために,euc-jp から shift_jis への変換スクリプトをいくつか載せます.

perlIO

perl5.8 では,ファイルの入出力にシステムの stdio に代わり PerlIO をデフォルトで使用するようになりました.perlIO は レイヤー という概念によりファイルハンドルの振る舞いを 制御することができます.レイヤーを指定するには,open 関数に3つの引数を 指定します.

open $in, "<:encoding(euc-jp)", $infile;
open $out,">:crlf :utf8",       $outfile;

2番目の引数がレイヤーの指定で,旧来の stdio の使用を指定したりでき ますが,ここでは文字コードの指定もできます.扱うファイルの文字コードが utf8 であってもレイヤーに :utf8 と指定することで, perl にテキストファイルであることを示します.そのほかの文字コードの場 合は,:encoding() を指定します.

ファイルの open 時に文字コードを指定できますが,すでに開いたファイ ルのファイルハンドルの文字コードも指定できます. STDIN や STDOUT も binmode で指定できます.

binmode($in,":encoding(shift_jis)");
binmode(STDIN,":encoding(euc-jp)");
binmode(STDOUT,":utf8");

open プラグマで指定しておくこともできます.この場合,open の引数では 文字コードを指定することはできません.

use open ":encoding(euc-jp)";
open $in, "<", $filename;

jperlからの移行