基本的に、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