utf-8とperl

  • 投稿日:
  • by
  • カテゴリ:

いや、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がダメになってしまうからですね。

これもはまりました。それにしても、「はまる」ということすら、楽しくなってくるというのが、プログラムを書く楽しみと言えるのでしょうか。山登りみたいなもんですかね……