



perl ソースの文字コードセットに utf8 を指定する。
use encoding "utf8"; とほぼ同じであるが、no utf8; によってlexical scope内※で use utf8; を無効にすることができる。※パッケージ直下なら、パッケージ内。{ } 内なら、そのブロック内。
この仕様は便利でもあるが、トラブルの元でもある。
use utf8 で変数に代入された文字列には、UTF8フラグが付き、"文字単位で処理が行われる(例えば、utf8文字列に対するlength関数は、バイト数ではなく文字数を返す)"。
no utf8 で変数に代入された文字列にはUTF8フラグが付かない。
この二種類の変数を混用すると文字化けが起こる。
use utf8 が有効なのはlexical scpoe内だから、モジュール間で状態が異なる場合があり、モジュールから返された文字列やモジュールに渡す文字列がどちらなのか、常に意識しなければいけない。ファイルに入出力する場合も同様。実際上、多数のモジュールを使ってプログラミングしていると全てのモジュールの状態を把握するのは困難なので、どうしても”文字単位の処理”をしなければならない部分にだけ use utf8 を使い、その処理が終了したら no utf8 に戻した方が確実な気がしてきている。
ファイル(標準出力も同様)にutf8文字列を出力する場合、UTF8フラグを取る(何もしなくても勝手に取ってくれるようであるが、警告が表示される):
open HANDLE, ">:utf8" , "ファイル名"
または open HANDLE , ">ファイル名";
binmode HANDLE , ";utf8"; ※標準出力なら、binmode STDOUT, ":utf8";
ファイル(標準入力も同様)から文字列を入力する場合、UTF8フラグを付ける:
open HANDLE , "<:utf8" . "ファイル名";
または open HANDLE , "ファイル名";
binmode HANDLE, ":utf8"; ※標準入力なら、binmode STDIN, ":utf8";
UTF8フラグは下記のユーティリティ関数で操作できる。ユーティリティ関数は、no utf8 でも使用可能。
utf8::encode($string) ;
UTF8フラグをOFFにする。文字コードセットを変換は行わない事に注意。
$success = utf8::decode($string) ;
UTF8フラグをONにする。文字コードセットを変換は行わない事に注意。
不正なUTF8を渡すと、$successに0が返る。
$flag = utf8::is_utf8(STRING) ;
UTF8フラグがONならば、trueを返す。
$flag = utf8::valid(STRING) ;
正しいUTF8表現であれば、trueを返す。正しいUTF8表現とは、UTF8フラグがONであり、正しいUTF8で構成される文字列である。