2007-04-21 出力
Catalyst::Plugin::FillInFormで文字が二重に化ける
ってかね。
すべてがUTF8でいけるなら本当になんの問題もでないのに出力をShift_JISにしなきゃいけないせいで各所各所でUTF8+Shift_JIS混合問題ややUTF8フラグ問題やその他もろもろ問題ですぎってばよ!
今度はFillInForm。
これ、UTF8フラグがたってないせいで化ける。なのでFillInForm::ForceUTF8が必要。
でもCatalyst::Plugin::FillInForm::ForceUTF8は存在しない。無いなら作るしかない。
package Catalyst::Plugin::FillInForm::ForceUTF8; use strict; use HTML::FillInForm::ForceUTF8; use NEXT; our $VERSION = '0.01'; sub finalize { my $c = shift; if ( $c->isa('Catalyst::Plugin::FormValidator') ) { $c->fillform if $c->form->has_missing || $c->form->has_invalid || $c->stash->{error}; } return $c->NEXT::finalize(@_); } sub fillform { my $c = shift; my $fdat = shift || $c->request->parameters; $c->response->output( HTML::FillInForm::ForceUTF8->new->fill( scalarref => \$c->response->{body}, fdat => $fdat ) ); } 1;
Catalyst::Plugin::FillInFormをまんまコピペしてForceUTF8を使うように変えただけ。
でもこれ実はid:hide-Kさんも同じ名前のモジュールを作ってるみたいで(使ってるCatalystのPlugins/Components - hide-k.net#blog)そうなるとこのモジュールCPANにあった方がいいんじゃないかとか思うんだけど。
でまぁひとまずコレでOKなんだけど、Catalyst::Plugin::Charsets::Japanese(今回の僕のケースではCatalyst::Plugin::Charsets::Japanese::Mobileを使ってますが同じことなので)と一緒に使う場合は注意が必要。
fillformはfinalizeで行われる。
Catalyst::Plugin::Charsets::Japaneseの変換処理もfinalizeで行われる。
なので先にfillformされてからCatalyst::Plugin::Charsets::Japaneseの変換処理が走らないと文字コードがごっちゃになって化けてしまう。
package MyApp; use Catalyst qw/ FillInForm::ForceUTF8 Charsets::Japanese /;
といった感じにFillInForm::ForceUTF8を先に継承しないといけない。
はぁ、前途多難。納期間に合うかな・・・。





