• ベストアンサー

POSTで受けたデータを jcode.pl するには

あまりに初歩的で書き込むのが恥ずかしいです。 今、フォームからアンケートを自分宛にE-Mailで もらえる CGI を書いています。 日本語処理以外の部分はほとんど全部動きました。 しかし、日本語のテキストは、メーラ(NC4.7付属) で受信すると、「%ほにゃらら」みたいな表現に なっていて、そのままでは読めません。 jcode.pl の使い方が間違っているらしいことは 簡単に推測できますが、ではどうまちがっている のか見当がつきません。 内容: アンケートのフォームで使用しているフィールド名 は、value01~value66です。 そこで、Actionで指定している cgi で、以下のように 記述してみました。 #!/usr/local/bin/perl require './cgi-lib.pl'; require './jcode.pl'; #日本語コード変換処理 &jcode'convert(*value,'jis'); #連想配列に読み込み &ReadParse (*value); $to = 'nydela@imasy.or.jp'; $ipaddr = $ENV{'REMOTE_HOST'}; この後、メール・ファイルを開いてSendMail してやると、66個のフィールドが全部届き ますが、日本語は読めません。jcode.pl と cgi-bin.pl は、この cgi と同じディレクトリに あります。 日本語が入力される可能性のあるフィールド 番号は分かっているので、&ReadParse の後で 個別に convert したらいいのかと思ったのですが、 今度は連想配列の要素を jcode'convertに どうやって渡したらいいのかわからなくなりました。 アドバイスお願いします。 あと、どういうわけか、 $ipaddr = $ENV{'REMOTE_HOST'}; も、ブランクしか帰しません。ちなみに$ENVを たとえば PATH に変更しますと、きちんとその 値を返します。これもアドバイスお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • makorin
  • ベストアンサー率44% (31/70)
回答No.1

私もそういったCGIを良く組みます。 私の場合はjcode.plを使っては居ません。 で、jcode.plは日本語コードの相互変換用なので、POSTした場合に変換される文字列はコンバート出来ないと思います。(POSTでは日本語コードがそのまま届くわけではないため) 私は以下のコードをいつも使っています。 #QUERY_STRINGの解析 $cl = $ENV{"CONTENT_LENGTH"}; read(STDIN,$qs,$cl); @qs = split(/&/,$qs); foreach $i (0 .. $#qs) { $qs[$i] =~ s/\+/ /g; $qs[$i] =~ s/%(..)/pack("c",hex($1))/ge; ($name,$value) = split(/=/,$qs[$i],2); $qs{$name} = $value; } CONTENT_LENGTHでPOSTした文字列の長さを調べ 標準入力からPOSTした文字列を取得します。 そして、取得した文字列を&で分割して配列に放り込み その書く配列で%xxなどの変換を行った後、NAMEとVALUEに分割し、NAMEを配列名とした連想配列に放り込みます。 GETの場合は、QUERY_STRINGに文字列が格納されています。 このコードは、インプレスから発行されている、CGIブックに載っているやり方です。内容的には古いですが、CやPerl、ShellでCGIを組む方法が掲載されています。結構便利なので一度見てみると良いと思います。 それと、FORM側で、encoding設定(ちょっと自信なし)を入れておくと、文字列のエンコードをして送ってくれるようです。 次にREMOTE_HOSTですが、取得できないサーバーが以外と有ります。 私が経験したのではトクトクとい無料サーバーでは取得できませんでした。ですが、REMOTE_ADDRは取得可能なので、そっちでIPアドレスを取得した方が良いと思います。 ただ、どっちも動かない場合は、サーバー管理者に環境変数がどれだけ取得できるか問い合わせた方が良いでしょう。

nydela
質問者

お礼

makorinさん回答ありがとうございました。 かなり腑に落ちました。ただ、まだよく理解 できていないので、ご紹介いただいた参考書で もういっぺん見直してみます。 どうも使っている参考書に問題がありそうな 気がしてきました。 また何かありましたらよろしくお願いします。

その他の回答 (1)

noname#25358
noname#25358
回答No.2

 &ReadParseを使うのであれば、とりあえずjcodeは必要ありません。  ただ&ReadParseを実行すれば、渡されたデータが自動的に %in という連想配列に取り込まれます。この関数はすべての引数が省略可能です。  あとは、   print $in{'value00'};  といった感じで読めます。  また、jcodeはJIS、シフトJIS、EUC間での文字コード変換用なので、「%ほにゃらら」から通常の文字列への変換に用いても意味がないです。  また、環境変数は相互のサーバーの設定によって特定の値を返したり返さなかったりします。

nydela
質問者

お礼

deagle さん、回答ありがとうございます。 ええ、 print $in{'value00'} については問題ないです。 しかし、POSTされたデータがエンコードされていた 事に気づいていませんでした。 これは、ある参考書からパクってきたのであまり でかい口叩けませんが、あの本、結構間違いが 多い気がします。 環境変数の件についても了解しました。 また何かありましたら、よろしくお願いします。

関連するQ&A

専門家に質問してみよう