Perlの文字コード変換の話 其の四
○ PerlIO のエンコード指定
PerlIO にエンコードを指定する場合、binmode() を用いる。
以下に例を挙げておく
binmode( STDIN, ':encoding(shiftjis)' ); # STDIN を shiftjis として扱う
binmode( STDOUT, ':encoding(shiftjis)' ); # STDOUT を shiftjis として扱う
ファイルハンドルに対する PerlIO も存在している
open( FH, '> hoge.txt' );
binmode( FH, ':encoding(shiftjis)' ); # FH を shiftjis として扱う
close( FH );
open( FH, '> hoge.txt' );
binmode( FH, ':bytes' ); # FH を バイト列 として扱う
close( FH );
○ ファイルハンドルに対する PerlIO のエンコード指定
前述の binmode を用いて、ファイルハンドルに対してエンコード指定を行うことが
できるが、三引数のopenを使うことでも、PerlIOにエンコード指定することができる。
サンプルコードを次に示す
use utf8;
use strict;
use warnings;
binmode( STDOUT, ':encoding(shiftjis)' );my $a_data = "ほげほげ";
my $a_file_name = 'hoge_utf8.txt';
open( OUT, '>:encoding(utf-8)', $a_file_name );
print OUT $a_data;
close( OUT );open( IN, '<:encoding(utf-8)', $a_file_name ); my $a_read =
;
close( IN );if( Encode::is_utf8( $a_read ) ){
print "utf8 on\n";
}else{
print "utf8 off\n";
}print $a_read . "\n";
結果は、次のようになる
utf8 on
ほげほげ
サンプルコードのポイントとなる部分としては、エンコードを指定されたPerlIOから
読み込んだ文字列にはutf8フラグが立つ点と、STDOUT に shiftjis を指定しているが、
utf8フラグが立っているのでPerlIOが変換して出力しているという点になる。