-PR-
解決済み

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

  • 暇なときにでも
  • 質問No.14501
  • 閲覧数126
  • ありがとう数6
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 100% (2/2)

あまりに初歩的で書き込むのが恥ずかしいです。

今、フォームからアンケートを自分宛に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 に変更しますと、きちんとその
値を返します。これもアドバイスお願いします。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.1
レベル9

ベストアンサー率 44% (31/70)

私もそういった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

お礼率 100% (2/2)

makorinさん回答ありがとうございました。

かなり腑に落ちました。ただ、まだよく理解
できていないので、ご紹介いただいた参考書で
もういっぺん見直してみます。

どうも使っている参考書に問題がありそうな
気がしてきました。

また何かありましたらよろしくお願いします。
投稿日時 - 0000-00-00 00:00:00
関連するQ&A
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.2

 &ReadParseを使うのであれば、とりあえずjcodeは必要ありません。  ただ&ReadParseを実行すれば、渡されたデータが自動的に %in という連想配列に取り込まれます。この関数はすべての引数が省略可能です。  あとは、   print $in{'value00'};  といった感じで読めます。  また、jcodeはJIS、シフトJ ...続きを読む
 &ReadParseを使うのであれば、とりあえずjcodeは必要ありません。
 ただ&ReadParseを実行すれば、渡されたデータが自動的に %in という連想配列に取り込まれます。この関数はすべての引数が省略可能です。
 あとは、

  print $in{'value00'};

 といった感じで読めます。

 また、jcodeはJIS、シフトJIS、EUC間での文字コード変換用なので、「%ほにゃらら」から通常の文字列への変換に用いても意味がないです。

 また、環境変数は相互のサーバーの設定によって特定の値を返したり返さなかったりします。
お礼コメント
nydela

お礼率 100% (2/2)

deagle さん、回答ありがとうございます。

ええ、
print $in{'value00'} については問題ないです。

しかし、POSTされたデータがエンコードされていた
事に気づいていませんでした。

これは、ある参考書からパクってきたのであまり
でかい口叩けませんが、あの本、結構間違いが
多い気がします。

環境変数の件についても了解しました。

また何かありましたら、よろしくお願いします。
投稿日時 - 0000-00-00 00:00:00


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ