[ トップページ ]

« ストリーム・データ処理によるオンライン・オークションのシミュレーション (構造化版) | メイン | VLAN タグつきのパケットを送受信するテスト・プログラム »

Web , 文字列

Perl でフォームデータから UTF-8 日本語文字をとりだす方法

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 をつかっている. ふるいものではうまく動作しないようだ.

Keywords:

トラックバック

このエントリーのトラックバックURL:
http://www.kanadas.com/mt/mt-tb.cgi/4008

コメントを投稿

このページについて

2009-06-22 22:54 に投稿されたエントリーのページです。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Creative Commons License
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.
Powered by
Movable Type 3.36