いかん。文字化けだけでなく、画面が真っ白になってしてしまった。
今日も帰りが遅くなってしまった理由の一つなのだが、最新のサーバ環境でアプリが動かないのである。Catalystのアプリが動かない。どうやら Catalystのバージョンだけでなく、Perl自体のバージョンが関係しているらしい。どうにもこうにも、UTF-8の扱いがうまくいかない。いや、これは開発機のバージョンが古かったというわけでなく、先日「これは便利」と思って使ったモジュールが悪さをしているような感じがする。
そのモジュールとは、Catalyst::Plugin::FillInForm::ForceUTF8というものである。HTML::FillInForm という便利なモジュールをCatalystのPluginにしたCatalyst::Plugin::FillInFormを、更にUTF-8対応させたモジュールである。こいつは、FormValidatorとセットで使うのだが、その機能とは、まずこいつをuseしておき、CatalystのRootコントローラのEndアクションの中でViewをレンダリングした後に、おまじないを書いておく、という使い方をする。(レンダリングした後に、というのが少し不思議)
そしてその機能とは、フォームから受け取った値をFormValidatorでバリデーションすると、エラーがあってもう一度入力フォームを表示させたときに、inputタグの中に明示的にvalueをセットしなくても、前の画面の値を自動的にセットしてくれる、という便利なものである。これを使う前はTT(Template Toolkit)の機能を利用して、動的に一つずつ埋め込んでいたのだ。
本番機と同じ環境でアプリを動かしたら文字化けしまくって、調べたらPerlの5.8からはUTF-8を内部的に使うようになっていて、その関係でいろいろ調べているうちに偶然見つけて、こりゃ便利と思って使ったのがこのモジュールである。しかし、こいつを使い出したら文字化けするのではなく、画面が真白で表示されなくなった。サーバがエラーを吐いている。「Wide character が云々」と、Catalyst::Engine の中で落ちているのだ。レンダリングに失敗している。”ForceUTF8″という名前なのに、なぜだ?
まあ、元のやり方に戻せば解決するとは思っているのだが、なんか悔しい。なんかいい方法ないかな。こいつを更に継承したクラスでも作るか。とかなんとか今また調べていたら、新たな情報を発見。どうやらこのForceUTF8版は古いようだ。今はPerl自体がUTF-8対応しているので、Catalyst::Plugin::Unicodeをuseして、Catalyst::Plugin::FillInFormを使えばいいらしい。う~ん、今ただちに試してみたいけど、続きはまた明日。