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>