文字コード

  1. スクリプトに渡すデータの文字コード
  2. スクリプト文字コード(文字列リテラル)
  3. 出力の文字コード

Encodeモジュールのエンコーディングオブジェクトのdecode関数は渡された文字列をutf8に変更し、その文字列にutf8フラグを付ける。
文字列の合成や連結は、utf8フラグが付いたもの同士を処理するのが良い。また、出力時にはencode関数でフラグを外す。utf8フラグはperlのみで使用するフラグである為、他のアプリ(たとえ出力するだけであっても)に渡さない方が良い。
また。「use utf8」をしている場合は文字列リテラル中に変数を渡すとそのような変数はないと言われるので、リテラル中で変数展開させない。

例1

use Encode;

my $sjis_enc = Encode::find_Encoding('shiftjis');
my $eucjp_enc = Encode::find_Encoding('eucjp');

while(<STDIN>){
 my $input = $eucjp_enc->encode($sjis_enc->decode($_));
 print "入力された文字は".$input."です\n";
}

例2

「use utf8」して、最後にencodeする
「use utf8」は文字列リテラルをutf8フラグ付き文字列にする、つまり、decodeせずともdecodeされた状態になる。

use Encode;
use utf8;
my $sjis_enc = Encode::find_encoding('shiftjis');
while(<STDIN>){
 my $input = $sjis_enc->decode($_);
 print $sjis_enc->encode("入力された文字は".$input."です\n"); 
}

例3 MacのTerminal等

use Encode;
use utf8;
my $sjis_enc = Encode::find_encoding('shiftjis');
my $utf8_enc = Encode::find_encoding('utf8');
while(<STDIN>){
 my $input = $sjis_enc->decode($_);
 print $utf8_enc->encode("入力された文字は".$input."です\n"); 
}