Perl の文字コード

基本的に、utf-8 を使用するのが好ましい。
だが、結構統一するのが面倒だったりする。

まず、

use utf8;

を宣言して、スクリプト自体が utf8 を使用している事を明示化する。
※ 旧 Perl は、色々な文字コードが存在しているため、utf8 であることを明示化する必要がある。

その次に、
標準出力、標準エラー出力、標準入力を明示化する

binmode STDOUT, ":utf8"; # 標準出力
binmode STDERR, ":utf8"; # 標準エラー出力
binmode STDIN,  ":utf8"; # 標準入力

後は、
ソース自体の文字コードを utf8 にすること。
これで、記述するスクリプトは、utf8 で統一される。
※ 標準入力(ようは受け取るデータ) が、utf8 じゃない場合は、やっちゃうとアウト
※ 例えば、OS の文字コードが、euc-jp とかだと、入ってくるデータがアレなので、駄目。

但し、他のライブラリの関数を使用した場合は、
戻り値や、エラーメッセージが utf8 で返ってこない可能性があるので、
文字コードを判断しなければならない。

例えば以下の場合…

use utf8;
eval
{
    OPEN( IN, $file_path) or die "$!";
};
if($@)
{
    print $@;
}

$@ に何の文字コードが入ってくるかは、状況によりけり。
その為、$@ が utf8 かを判断する必要がある。

その為、
以下のよう、utf8 に decode する。

use utf8;
use Encode;
eval
{
    OPEN( IN, $file_path) or die "$!";
};
if($@)
{
    # UTF8ではない場合
    unless( utf8::is_utf8($@)
    {
        # utf8 にデコード(UTF8 に変換)する
        $@ = Encode::decode( 'utf-8', $@);
    }
    print $@;
}

他の注意点としては、
標準出力、標準エラー出力、標準入力は既に utf8 としている為、
encode して出力する必要はないと言うこと。

encode( 'utf-8', "あああ" );

としてしまうと、utf8 -> utf8 で文字化ける。
但し、他の文字コードに変換するときは必須。

例えば、cp932 文字コードでファイル出力する場合は、

encode( 'cp932', "あああ" );

で、明示的に変換する事。
最終更新:2011年12月27日 23:40