Perlの文字コード変換の話 其の弐

○ use utf8 プラグマを用いた場合の挙動

use utf8 プラグマを用いた場合、次のような挙動をする。

  • ソースコードに含まれている定数文字列にutf8フラグを立てる
  • PerlIO レイヤは、*何もしない*
  • 変数にマルチバイト文字が使える

三番目の変数にマルチバイト文字が使えるってのは、ネタに近いのでスルー

utf8 フラグとPerlIOレイヤは、Perl 5.8.*以降からは超重要な概念なので、後述する


○ utf8 フラグ

Perl 5.6 以前のバージョンでは、すべての文字列はバイトの並びとして扱われていたが、
5.8.* 以降では、バイトの並びと文字列は区別されるようになった。

内部的に文字コードUnicodeとして扱われているため、文字列データを示すフラグを
utf8フラグと呼ぶ。

データが、utf8フラグを持つか判定するためには、Encodeモジュールに含まれている
Encode::is_utf8() フラグを用いる。

サンプルとして、以下のコードを挙げる

use utf8;
binmode( STDOUT, ':encoding(shiftjis)' );

if( Encode::is_utf8( "ほげほげ" ) ){
print "utf8 on\n";
}else{
print "utf8 off\n";
}

結果として、

utf8 on

が得られる。
ここでコードはutf-8で記述されていること

さて、 use utf8 プラグマが指定されていないときの挙動はこれとは異なり、プラグマ部分を
コメントアウトした場合には、次の結果となる

utf 8 off