CGI::Application + Tempalte-Toolkit メモ

CGI::Application で TT2 を使うときのメモ。

TT2の設定

Template::Provider::Encoding と Template::Stash::ForceUTF8 を使うようにしておく。

use CGI::Application::Plugin::TT;
use Template::Provider::Encoding;
use Template::Stash::ForceUTF8;

__PACKAGE__->tt_config(TEMPLATE_OPTIONS => 
     {
          LOAD_TEMPLATES => [ Template::Provider::Encoding->new ],
          STASH => Template::Stash::ForceUTF8->new,
     }
);

文字コード設定

Content-type を指定しておく。
あと、CGI.pm は文字コードまで面倒を見てくれないので、setup あたりで自力でデコードする。
ちなに、use encoding していると $q->param の戻り値にUTF-8フラグが立つが、1 byte ごとに chr を通した結果なので、やめておいたほうが無難。*1

use constant APP_ENCODING => 'utf8';

sub setup {
    my $self = shift;
    my $q = $self->query;

    $self->header_props(-type => 'Content-type: text/html; charset=' . APP_ENCODING);

    for my $p ($q->param) {
        my @v = map { Encode::decode(APP_ENCODING, $_) } $q->param($p);
        $q->param($p, @v);
    }

    // do something
}

なんか、もっといい方法もあるような気がするけど。とりあえずこんな感じで。

*1:入出力がUTF-8の場合はutf8::decode でなんとかならない気もしないではないが