文字、バイト、正規表現
理解があいまいなので、試しに色々書いてみる。
まずはeuc-jpでスクリプトを書いてみる。
my $str = "漢"; print ".は文字にマッチする\n" if ($str =~ /^.{1}$/); print ".はバイトにマッチする\n" if ($str =~ /^.{2}$/);
「.はバイトにマッチする」が出力される。
続いてutf-8で同じスクリプトを書く。
my $str = "漢"; print ".は文字にマッチする\n" if ($str =~ /^.{1}$/); print ".はバイトにマッチする(2)\n" if ($str =~ /^.{2}$/); print ".はバイトにマッチする(3)\n" if ($str =~ /^.{3}$/);
「.はバイトにマッチする(3)」が出力される(utf-8だと漢字は3バイトで表現されるため)
ところが、use utf8;すると
use utf8; my $str = "漢"; print ".は文字にマッチする\n" if ($str =~ /^.{1}$/); print ".はバイトにマッチする(2)\n" if ($str =~ /^.{2}$/); print ".はバイトにマッチする(3)\n" if ($str =~ /^.{3}$/);
「.は文字にマッチする」が出力される。
use utf8;は内部形式で扱うよん、ということなので納得ではある。
こいつをeuc-jpで実現するには、こんな風に。
use Encode; my $str = "漢"; $str = Encode::decode("euc-jp", $str); print ".は文字にマッチする\n" if ($str =~ /^.{1}$/); print ".はバイトにマッチする\n" if ($str =~ /^.{2,}$/);
結果は「.は文字にマッチする」となる。
あ〜、やっとすっきりした。