いや、perlが5.8になってから、utf-8フラグがらみで、面倒なことばっかりだな。と、正直思ってたんです。
でも、考えを改めてもいい。正直そう思った。
たとえば、「スペースで区切って、複数のワードを入力する」というインターフェースがあった場合、「スペース」がすべていわゆる半角スペースであると仮定すれば、splitでわけるだけですよね。インターフェースの都合上、いわゆる全角スペースが混じってしまう可能性があるとすると、その全角のスペースを一旦半角スペースに変換してからsplitしないとだめになるわけですよ。
ところが、split( /[\x{0020}\x{3000}]/, $input )
ってやるだけで、$inputがUTF8フラグ付なら、一発でわけることができるわけですね。ちゃんと「バイト列」ではなくて「文字列」として扱ってつわけですな。
でも、逆に、面倒なのが、バイト列として扱うときの操作。たとえば、urlで許されない文字をaタグなんかにつかうときにつかう、%xx%xxというあれですね。
sub my_encode{ my $tmp = shift; $tmp = Encode::encode('utf8',$tmp); $tmp =~ s/([^\w])/'%'.unpack("H2", $1)/ego; $tmp =~ tr/ /+/; $tmp = Encode::decode('utf8',$tmp); return $tmp; }
ってな感じに、文字列ではなくバイト列として扱うように、UTF8フラグを外してから変換してUTF8フラグを立てるという処理にしなくてはいけません。文字列のままだと[^\w]
が1バイトとは限らないので、unpackのH2の2がダメになってしまうからですね。
これもはまりました。それにしても、「はまる」ということすら、楽しくなってくるというのが、プログラムを書く楽しみと言えるのでしょうか。山登りみたいなもんですかね……