0:00
 
Window Title
 
 
 
 
 
 
 
 
壁紙の変更

コンピュータ

ネットワーク

ドキュメント

ごみ箱
マイコンピュータ
マイネットワーク
マイドキュメント
ごみ箱

オンラインゲーム

DHTML素材

perl module忘備録

RFC翻訳

文字コード

 

コンピュータ

ネットワーク


コントロールパネル

perl module 忘備録

utf8

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で構成される文字列である。

レディ