文字、バイト、正規表現

理解があいまいなので、試しに色々書いてみる。
まずは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,}$/);

結果は「.は文字にマッチする」となる。


あ〜、やっとすっきりした。