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さんも同じ名前のモジュールを作ってるみたいで(http://blog.hide-k.net/archives/2006/11/catalystplugins.php)そうなるとこのモジュール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を先に継承しないといけない。

はぁ、前途多難。納期間に合うかな・・・。