UTF-8 のフォームによっておくられたデータのなかから日本語文字をとりだすことは,日本の Perl CGI プログラマならたいてい必要になることである. ところが,その方法は意外に確立されていないようにみえる. ここでは私が試行錯誤したうえ確立した方法を書く.
UTF-8 の環境が確立されるまえは EUC-JP や Shift JIS で日本語データをあつかっていた. ところが,UTF-8 が一般化すると,それまでのやりかたではうまくいかないばあいがでてきた.
フォームの送信には GET メソッドと POST メソッドとがある. GET メソッドのときは $ENV{'QUERY_STRING'} に送信データがふくまれている. また,POST メソッドのときはつぎのようにしてデータを獲得する.
if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
最近の Perl 処理系では UTF-8 の文字列に UTF-8 テキストであることをしめすしるしづけがなされているが,環境変数をデコードする関数 CGI::unescape がかえす値にはこのしるしづけがなされていない. そこで,decode という関数をよびだしてしるしをつけてやる. つまり,つぎのようにすればよい.
$buffer = decode('utf8', CGI::unescape($buffer));
CGI::unescape にも decode にも,よく似た関数がいろいろあって,どれをつかったらよいか,まよう. どれでもおなじならばよいが,実はうまく動作しないものもある. それにダマされて,上記の解に到達するまでにずいぶん時間をつかってしまった ;-) Perl の処理系としては Perl 5.10.0 をつかっている. 私自身は Linux としては Fedora 11 をつかい,Windows 上では Strawberry Perl 5.10.0 をつかっている. ふるいものではうまく動作しないようだ.