Perl の CGI.pmはよくお世話になりますが、UTF8を扱おうとすると、utf8フラグがたったり、なかったりと問題があるようで、めんどくさいのでCGI.pmでパラメータ受け取るときにすべてのパラメータを一度に処理してます。
1件ごとでなくて、飛んできたパラメータ全部をdecodeしてみる。
use CGI; for my $p ($CGI->param) { my @v = map {Encode:: decode_utf8 ($_)} $CGI->param($p); $CGI->param($p,@v); }
たつをのChangeLog殿から、dankogai殿の指摘をみて、自分のコードも少々修正してみました。
たつをのChangeLog Perl の utf8 まわりのおまじない
use utf8; use CGI; ... my $text = $q->param('text') || ""; utf8::decode($text) unless utf8::is_utf8($text); ...
Encode:: decode_utf8を使いましょうとのご指摘はこちら。
http://blog.livedoor.jp/dankogai/archives/51290188.html
Validationの観点だけではなく、簡潔性の観点からも、Encode::decode_utf8()はおすすめです。すでに UTF-8 flag がついた文字列はそのままコピーするだけなので、条件分岐も不要です。
なるほどー