• ベストアンサー
  • 暇なときにでも

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 に変更しますと、きちんとその 値を返します。これもアドバイスお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数147
  • ありがとう数6

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

  • ベストアンサー
  • 回答No.1
  • makorin
  • ベストアンサー率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アドレスを取得した方が良いと思います。 ただ、どっちも動かない場合は、サーバー管理者に環境変数がどれだけ取得できるか問い合わせた方が良いでしょう。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • jcode.pl と &ReadParse()

    CGIファイルの先頭は #!/usr/local/bin/perl require './cgi-lib.pl'; require './jcode.pl'; &ReadParse(); という感じになっています。 ここでのの require は、日本語を使うためのもの だと思っています。合っていますか? &ReadParse() というのは何ですか? require と関係があるみたいです。 require を書かずに &ReadParse() を書くとCGIエラーになります。

    • ベストアンサー
    • CGI
  • CGIでjcode.plを読み込めなくなりました

    さんざん検索をかけて色々試したのですが、どうしても解決できず どなたかご存知のかた、教えてください。よろしくお願い致します。 つい昨日までちゃんと動いていたCGIが突然 「jcode.plがありません」 と訴えてきました。 4月にサーバーを乗換え丸2ヶ月、問題なく動いていたのに 突然です。何がなんだか分かりません。 もちろん、このCGIに関わるファイルは一切いじっておりません。 自分なりに検討した結果 引っかかっているのは以下のコード # 漢字コード変換ライブラリを読み込む if (-f "jcode.pl") { require "jcode.pl"; } else { &errexit("jcode.plがありません。\n"); } -略- &jcode'convert(*tmp, $kcode_cgi); このふたつです。jcode.plを読み込めない為にもれなく後出の呪文が効かないんだろうなという事は推測しているのですが。 このためフルパスでも試しましたが変化なし。 この読み込みをしなければ、CGIは取りあえず表示します。 なので、日本語変換プログラム以外は正常に動作しているようです。 どなたか同じような経験の有る方いらっしゃいませんか? アドバイスよろしくお願い致します。

    • ベストアンサー
    • CGI
  • jcode.plの使い方

    最近cgiを始めたばかりの者です。 HTMLでフォームを作り、 FORM action="view.cgi"method="GET" でcgiに渡すようにしました。 CGIで受け取った文字に全角があると %83%8B%83i%83e%83B%83N%83X のような文字化けをします。 調べてみたところjcode.plを使えば 文字化けを回避できるようですがうまく いきませんでした。 質問1.jcode.plを読み込ませるのは 上記のview.cgiで良いのでしょうか。 質問2.require "jcode.pl";といれた後 具体的にどのように受け取ったデータを jcodeに渡せばいいのでしょうか? @data = split(/&/,$ENV{QUERY_STRING}); で@dataに受け取った情報を渡しています。 ご教授頂ければと思います。 よろしくお願いします。

    • ベストアンサー
    • CGI

その他の回答 (1)

  • 回答No.2
noname#25358
noname#25358

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • jcode.plについて

    次のエラーが発生します。 Undefined subroutine &jcode::convf called at ./jcode.pl line 291. カレントに、jcode.plを置いているだけでは動作するのでしょうか? また、Jcode.pmを使った場合、 &Jcode::convert(\$test_sjis, "sjis"); と大文字にしないといけないのですが、これは仕方ないことでしょうか? てっきり、 require './jcode.pl'と use Jcode.pmの差し替えで済むと思っていました。 #!/usr/bin/perl require './jcode.pl'; my $test = "パソコン結構です。"; #文字化けチェック用 my $test_sjis = $test; my $test_ujis = $test; my $test_jis = $test; &jcode::convert(\$test_sjis, "sjis"); &jcode::convert(\$test_ujis, "ujis"); &jcode::convert(\$test_jis, "jis"); print "\$test_sjis=[$test_sjis]\n"; print "\$test_ujis=[$test_ujis]\n"; print "\$test_jis =[$test_jis]\n"; exit; __END__

    • ベストアンサー
    • Perl
  • jcode.pl

    日記などのスクリプトを作成しているのですが、とりあえず今まで、そこまでの理由もわからず他のスクリプトに習ってjcode.plをデコード処理部で &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); のように使ってきました。 ですが、たまたま今回、jcode.pl等を書き忘れてしまったのですが、ブラウザから投稿してみても文字化けという文字化けが起こりません。スクリプト自身はsjisで書いています。ログファイルもどうやらsjisコードで書き込まれているようなのですが、それでもjcode.plは必要なのでしょうか。windows XP にApache + Active Perl での動作と、@niftyで設置して動作を確認しました。 この場合、jcode.plは必要あるのでしょうか?

    • ベストアンサー
    • Perl
  • jcode.plアップロード不要の場合の設定変更

    CGI設置にあたり、設定変更で悩んでいます。 jcode.plがサーバーにプリインストールされているためアップロードは不要で、require 'jcode.pl'; と記載するようにとのことです。 require "./jcode.pl"; となっているものについては問題なかったのですが、 $jcode = './jcode.pl'; 中略 require $jcode; と記述されているものを、どのように書き換えたらよいのか分かりません。 ご教授のほど、どうぞよろしくお願い致します。

    • 締切済み
    • CGI
  • 「jcode.pl」が正しく配置されているのかどうか、判断に困っていま

    「jcode.pl」が正しく配置されているのかどうか、判断に困っています。 サーバー移転後の動作確認中、上記のことで悩んでいます。 このファイルは(日本語文字コードに関するプログラムですよね?)メールを送信することに関わるフォルダの中に入っており、「send.cgi」の中にも「require './commons/jcode.pl';」のように書き込まれています。この「send.cgi」は問題なく動き、メールも送信できます。 以上の状態で、「jcode.pl」はサーバーに正しく配置されたと判断してよいでしょうか? なぜ疑問に思うかと申しますと、 「http//:xxxx.com/xxxxxx/mail/commons/jcode.pl」 のようにURLをうちこんで表示させようと試みたときに、 「Internal Server Error」が表示されるのです。 これはどういうことでしょうか? 「jcode.pl」が正しく配置されていないということでしょうか? ちなみにパーミッションは旧サーバーと同じにしました。 どなたか、ご指導いただけますと幸いです。 よろしくお願いします。

  • Jcode.plを使用してコンバート

    if($ENV{\'QUERY_STRING\'} eq \"\"){ read(STDIN, $buffer, $ENV{\'CONTENT_LENGTH\'}); }else{ $buffer = $ENV{\'QUERY_STRING\'}; } @pairs = split(\'&\',$buffer); foreach $pair (@pairs) { ($name, $value) = split(\'=\', $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(\"C\", hex($1))/eg; &jcode::convert(\\$value,\'sjis\'); $form_data{$name} = $value; } Getメソッドで文字「?a=あ」をperlのJcode.plを使用してコンバートしましたが、 ブラウザのURL表示部は「?a=%82%A0」となり、shift_jisの16進数表示されてしまいます。 クッキーに取り込んで表示しても??と表示されてしまいます。 何かしら変換しているみたいのですが、 変換方法はあってるのでしょうか?

    • ベストアンサー
    • Perl
  • cgi-lib.plのReadParse関数

    あるパールからcgi-libを呼び出して、ReadParse関数を使おうとするとInternal Server Errorがでてしまいます。 パールの中身は #!/usr/local/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse(*in); です。 そこで3行目と5行目の行頭に#をつけて飛ばすとパールは正常に動きます。 これってcgi-lib.plのReadParse関数がいけないんでしょうか? ダウンロードしたまま何も変更していないのに..... ちなみにサーバーのパールのバージョンは5.004のようです。

    • ベストアンサー
    • CGI
  • cgi-lib.plの&ReadParse();の()の中

    cgi-lib.plのReadParseを使う時、  require 'cgi-lib.pl';  &ReadParse(*---); こんな風に書きますよね? ()の中はどういう意味なんでしょうか? 何でもいいんですか?

    • ベストアンサー
    • Perl
  • jcode'convertについて

    以下のようなプログラムを書きました。 -------------------------------------------------------------- require 'jcode.pl'; @a=("ら","ー","め","ん"); @b=("半","ら","い","す"); foreach $a(@a){ &jcode'convert(*a, "sjis"); foreach $b(@b){ &jcode'convert(*b, "sjis"); print $a; print $b; $aaa = <STDIN>; } } ------------------------------------------------------------------ &jcode'convert(*a, "sjis");が無いときは'ら半','らら','らい',,'らす','ー半'… といくのですが、&jcode'convert(*a, "sjis");をつけると'らす'でプログラムが終わってしまい、'ー半'…以降がプリント出来ません。 どうすればよいのでしょうか。またどうしてこうなるのでしょうか。

  • jcode.pl 使い方

    いままで、日本語を使わなかったのですが、 今、開発中のCGIでは日本語を処理しています。 ローカルサーバでのテストでは問題なかったのですが、βテストを開始してみると、環境によって文字化け。 出力する同じHTMLの中に場合によってEUCとS-JISなどが混在する状況になってしまいました。 そこで、jcode.plを使用し、コードの統一を行おうと思うのですが、日本語での解説ページまた、使用方法を解説している質問、回答が見つからなかったので、関数の使用方法を教えていただきたく思います。 私は、英語がすごく苦手なのでjcode.plの中の使用方法を見ても全く読めなかったのです。 日本語で分かりやすく書いていただけると幸いです。

    • ベストアンサー
    • Perl
  • &jcode'convert(しても文字化けする

    cgiにある日本語文書contents.txtをメール受信すると文字化けします。 解決策を教えてください。 require './jcode.pl'; open(FH, ">contents.txt"); print FH @contents; close(FH); #連結 $contents=""; foreach $key (@contents) { $contents=$contents.$key; } &jcode'convert(*contents,'jis');

    • ベストアンサー
    • CGI

専門家に質問してみよう