« Catalyst::Plugin::Captcha | メイン | MySQLが起動せず。 »

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>