Unicode::RecursiveDowngrade

UTF-8 フラグがどうもウザいという人向けにこんな CPAN モジュールがあるそうな。

「あるそうな」というか作ったのあなたでしょと軽くツッコミつつ、これはいいものです。Perl 5.8 における悩ましい問題であるところの UTF-8 フラグを、データ構造を再帰的に下って全部 off にしてくれるモジュールです。

なにげにフラグを落とす処理を

pack('C0A*', shift)

と pack な魔法でやってるところも素敵。Encode や unicode を必要としないので Perl 5.6 とかでも使えます。pack な方法はおそらく竹迫さんのパワポから得たヒントかな。

これまで、TT で utf8off なんてフィルタを書いて

[% item.title | utf8off | html %]

とかバッドな感じで対応してたのですが、Unicode::RecursiveDowngrade を使えばテンプレートに渡す前に一回こいつを通してやればいいので楽ちんです。

あと、TT の utf8off なフィルタなやり方だと、対処できない場合もあったりするのでますます重宝するかも。具体的には、mod_perlFastCGI なんかで Perl を永続化した場合に発生する現象なのですが、リクエストを処理し終えるまでの途中のサイクルで、XML::Parser を使用した parse とか、unicode フラグが立つ処理をすると(そのフラグが立ってる変数を実際に使ってなくても)それだけで出力が化ける場合があります。unicode フラグが立ってる箇所を全部 OFF にしちゃえばいいみたいなのですが、そもそも何でそうなるかとか細かいところまで追いきれず、結局 XML::Parser を Hack して unicode フラグが立たないようにして妥協してました。これでその必要もなくなりますね。感謝感謝。