日本語文字の入力(CGI)


 意見やアンケートへの回答を求めるページでは,日本語のデータをページの フォームから受け取り,CGIプログラムで処理する必要があります。日本語デー タがどのような形でCGIプログラムへ送られるかを確かめ,それらを処理する プログラムの例を示します。
  意見を尋ねるページがあるとします。

 このページ上で,「送信ボタン」を押すと,テキストフィールドに入力されたデータがiken.cgiへ送られます。フォームから送られる「生」のデータは,スペースや一部の記号,日本語コードを,送信に安全な文字コード(一部のASCIIコード)に変換(URLエンコード)しますので,そのままでは意味がわかりません。

 日本語文字は文字コードを16進数で表し,その前に%をつけます。シフトJISコードで「あ」は「82A0」なので,エンコード結果は「%82%A0」となります。また,1バイトの空白は「+」になります。

 プログラムはそれらを元の形に戻して(デコード)する必要があります。 iken.cgiは,生のデータを表示するとともに,変換したデータを表示するプログラムです。


#!/usr/bin/perl ←perlプログラムを実行するプログラム(インタプリタ) require 'jcode.cgi'; ←日本語文字コードの変換をするプログラムを取り込む read(STDIN,$data,$ENV{"CONTENT_LENGTH"}); ←データを標準入力から読む print"Content-type:text/html;charset=EUC-JP\n\n"; ← HTMLを出力 print <<EOF; <HTML> <HEAD> <TITLE>Thank you for your opinion</TITLE> </HEAD> <BODY> EOF print <<EOF; <H2>生のデータ</H2> <HR> $data<BR> ←生のデータをそのまま表示 <HR> EOF &decode(); ←データを変換するサブルーチンを実行 print <<EOF; <H2>変換したデータ</H2> <HR> お名前:$cgi{'name'}<BR> ご意見:$cgi{'opinion'}<BR> <HR> <A HREF="../iken.html">戻る</A><BR> EOF print"</BODY>\n"; print"</HTML>\n"; sub decode{ ←データを変換するサブルーチン @parts=split('&',$data); ← &で生のデータを分離 foreach(@parts){ ($name,$value)=split("="); ← =で名前と値を分離 $value=~ tr/+/ /; ← +を空白に変換 $value=~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; ↑ 16進数を取出し,10進数にし,それを文字コードに変換 &jcode'convert(*data,'euc'); ← EUCコードに変換 $cgi{$name}=$value; } }