HTML::FillInForm::ForceUTF8
*:: ForceUTF8インスパイア。ただ、Catalyst::Plugin::UnicodeやDBIx::Class:: UTF8Columns、Class::DBI::utf8などを使っている場合、必要ないかも。
__追記__
ソースはここにおきました。
http://nomadscafe.jp/archives/HTML-FillInForm-ForceUTF8-0.01.tar.gz
__/追記__
package HTML::FillInForm::ForceUTF8; use strict; use base qw(HTML::FillInForm); use Encode; sub fill{ my ($self, %option) = @_; if (exists $option{file}) { if ( ref $option{file} ) { binmode $option{file}, ":utf8"; } else { open my $fh, ":utf8", $option{file}; $option{file} = $fh; } } elsif ( exists $option{scalarref} ) { Encode::_utf8_on(${$option{scalarref}}) unless Encode::is_utf8(${$option{scalarref}}); } elsif ( exists $option{arrayref} ) { for ( @{$option{arrayref}} ){ Encode::_utf8_on($_) unless Encode::is_utf8($_); } } $self->SUPER::fill(%option); } sub _get_param { my $self = shift; my $ret = $self->SUPER::_get_param(@_); for ( ref($ret) ? @$ret : $ret ){ Encode::_utf8_on($_) unless Encode::is_utf8($_); } return $ret; } 1;
↓テストはこんな感じで。
my $str = "あいう"; my $str2 = "\x{5bae}\x{5ddd}"; my $parser = HTML::FillInForm::ForceUTF8->new(); print $parser->fill( file => "test.tt", fdat => { a=>$str, b=>$str2 } );
↓test.tt
<form method="post" action="/foo"> <input type="text" name="a" value="" /> <input type="text" name="b" value="" /> </form>