Unicode::RecursiveDowngrade
「あるそうな」というか作ったのあなたでしょと軽くツッコミつつ、これはいいものです。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_perl や FastCGI なんかで Perl を永続化した場合に発生する現象なのですが、リクエストを処理し終えるまでの途中のサイクルで、XML::Parser を使用した parse とか、unicode フラグが立つ処理をすると(そのフラグが立ってる変数を実際に使ってなくても)それだけで出力が化ける場合があります。unicode フラグが立ってる箇所を全部 OFF にしちゃえばいいみたいなのですが、そもそも何でそうなるかとか細かいところまで追いきれず、結局 XML::Parser を Hack して unicode フラグが立たないようにして妥協してました。これでその必要もなくなりますね。感謝感謝。