文字列処理いろいろ
内部エンコーディング
http://app.blog.livedoor.jp/dankogai/tb.cgi/50276015
Perl 5.8では内部で扱う文字コードもUTF-8です。それ以外のUTFはすべてEncodeモジュールで扱うことが出来ます。
perlスクリプトはUTF-8で書くのが無難ということだね。
なお、内部的に扱われている Unicode 文字列にはUTF8フラグがつくとのこと。
http://www.rwds.net/kuroita/program/Perl_unicode.htmlによれば
フラグが無効であれば、スカラ内のバイト列は、シングルバイトエンコーディングとして、解釈されます。フラグが有効であれば、スカラ内のバイト列は、 (マルチバイトの、可変調の) UTF-8 でエンコードされたキャラクタのコードポイントとして、解釈されます。
ONだと文字列はUTF-8でエンコードされたものと解釈される。
OFFだと文字列はシングルバイトエンコードされたものと解釈される。
ということか(いまいち理解不足)
UTF8フラグのON/OFF
何もしていなければ、UTF8フラグはOFF
use utf8;すると、ONになる。*1
では、実験。
use_utf.pl
use utf8; my $str = "あ"; #must be ON print utf8::is_utf8($str) ? "Flag is ON\n" : "Flag is OFF\n"; #must be single _ $str =~ s/[あ]/_/g; print $str."\n";
[結果]
Flag is ON
_
次。
no_use_utf8.pl
#use utf8; my $str = "あ"; #must be OFF print utf8::is_utf8($str) ? "Flag is ON\n" : "Flag is OFF\n"; #must be ___ $str =~ s/[あ]/_/g; print $str."\n";
[結果]
Flag is OFF
___
packとunpack
perldoc -f pack
pack TEMPLATE,LIST
Takes a LIST of values and converts it into a string
using the rules given by the TEMPLATE.
packはTEMPLATEで指定されたルールに基づきLISTをバイナリに変換し、結合する関数。
perldoc -f unpack
unpack TEMPLATE,EXPR
"unpack" does the reverse of "pack":
it takes a string and expands it out into a list of values.
(In scalar context, it returns merely the first value produced.)
unpackはバイナリをTEMPLATEで指定されたルールに基づきLISTに展開する関数。
URLエンコード/デコード
#エンコード $str =~ s/(\W)/'%' . unpack('H2', $1)/eg; #デコード $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;