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が変換して出力しているという点になる。