• ベストアンサー

perlの挙動について

http://yowyow.sakura.ne.jp/test/http.cgi httpのレスポンスを確認するための動作をテストしていたところ 上記で送信ボタンを押すと処理が行われた後に、要素が一つ認識されなくなります 文字コードの問題かと思ってutf-8に変換しても同様の結果でした 以下にソースを圧縮したものを置いてあります http://yowyow.sakura.ne.jp/test/test.zip 何が悪いのか教えていただけますでしょうか・

  • Perl
  • 回答数1
  • ありがとう数3

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

  • ベストアンサー
  • kichi8000
  • ベストアンサー率41% (658/1581)
回答No.1

perlですよね。 >文字コードの問題かと思って どこって。 文字コード指定がhtmlヘッダにしかないのだけど。 CGIヘッダと、入出力指定にも文字コード指定をしないとサーバーが勝手にコード指定してしまうのでCGIが不安定になる。 テキストファイルの保存形式も結構重要。 テキストファイルだからって中身が何でもいいわけじゃない。 文字化けしないための処置は以下。 CGIだけがutf-8保存ファイルでその他のテキストファイルがsjis保存、htmlもsjis指定の場合。 #!/usr/bin/perl use utf8;#以下の文字コードがutf8で記述されているとCGIに対して宣言。日本語記述が出る前に宣言。スクリプト途中でコードを変える時にも使用できる。 use CGI; use Encode;#標準で用意されていなければ自前でlibフォルダーを作ってサイトからダウンロードして保存しておく。 use open IN => ":encoding(cp932)"; # 入出力ファイルがWindowsのShiftJIS宣言 use open OUT => ":encoding(cp932)"; use open IO => ":encoding(cp932)"; binmode STDIN, ":encoding(cp932)";#標準入出力print文のShiftJIS宣言 binmode STDOUT, ":encoding(cp932)"; ついでに、cgiがutf8でhtmlがsjis指定で入力フォームのデータが日本語を使用しているなら文字コード指定が必要。なければいらない。 $text =decode( 'cp932',$http->param("formdata")); htmlがsjis指定だとこうなる。 初歩の初歩的なミス。 cgiサーバーが「文字コード指定をしていないcgiスクリプト」を文字コード違いで読込んでしまうと、保存形式を変えてもコードを変えてくれないので、文字コードを正しく指定すること。 cgiファイル他すべての保存形式ががsjisの時は、これを宣言しないといけない。 この場合は、使用できない関数がある。(文字検索で文字化けなど) #!/usr/bin/perl use cp932;#以下の文字コードがsjisで記述されているとCGIに対して宣言。 入出力のcp932宣言はいらない。

angel2015
質問者

お礼

回答ありがとうございました(`・ω・´)

関連するQ&A

  • Perlのcgiを中国語で表示可能にしたい

    OS:Windows7でサーバーはロリポップを使用しております。 Perlのcgiを「utf-8」で保存し、Perl内のhtmlも、「<meta http-equiv="Content-Type" content="text/html; charset=utf-8">」などのutf-8の設定にしていますが、ffftpでutf-8の文字コードで転送すると、「※CGI もしくは SSI が正しく動作していません。」と表示されてしまいます。 ffftpのホストの設定での、文字コードは「ホストの漢字コード Unicode(UTF-8)」、「ファイル名の漢字コード Unicode(UTF-8)」にしています。 何パターンか試してみましたが、ffftpの転送時の設定が「Unicode(UTF-8)」だと、「※CGI もしくは SSI が正しく動作していません。」と表示されるみたいです。 転送時の設定を「ホストの漢字コード 無変換(SHIFT-JIS)」、「ファイル名の漢字コード SHIFT-JIS」 にすると、cgiは動作します。但し、文字化けします。→ 黒い菱形に?マークの文字化け。 どうすれば、上記問題を解決できるでしょうか。 アドバイスをお願いします。 m(_ _)m

    • ベストアンサー
    • Perl
  • PerlでZipファイルを作りたい

    PerlでZipファイルを作りたいのですが上手くいきません。 実行すると「Internal Server Error」になります。 Perlのバージョン:5.008009 文字コードは、Shift_JIS 改行コードは、Unix(LF)、です。 サーバーは「さくら」です。(ドリームホストも試しましたがダメでした) ファイル構成は zip.cgi data.txt 同じ階層に置いてます。 こちら https://www.h-fj.com/blog/archives/2010/07/19-203224.php のサイトを参考にさせてもらって下のように作ったのですが・・・ (print "Content-type: text/html¥n¥n";)は自分で勝手に 「いるんじゃない?」と思って付け加えました。 私、どこが間違っているのでしょうか? よろしくお願いします。 ———————————————————————————— zip.cgi ———————————————————————————— #!/usr/bin/perl use strict; use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); my $zip = Archive::Zip->new(); # Zipのオブジェクト作成 $zip->addFile('data.txt'); # ファイルを圧縮 # Zipファイルに保存する print "Content-type: text/html¥n¥n"; if ($zip->writeToFileNamed('test.zip') == AZ_OK) { print "test.zip is successfully saved.¥n"; } else { print "test.zip save error.¥n"; } exit;

    • ベストアンサー
    • CGI
  • ある書籍で、見つけました、perlのソースについて

    ある書籍で、見つけました、perlのソースについて 疑問がありまして、お尋ねします。 ※下記は、perl/cgiソースの一部です。 ある書籍で見つけたものです。 >require 'cgi-lib.pl'; >&ReadParse(¥%test); 私は、(%test)だと思っているのですが。 ()の中の、先頭に「¥」を付けることに、どのような意味 があるのでしょうか >$test = $test{'test'}; 仮に、$testの値が「"<&>"」だったとしまして、以下 をごらん頂きたいのですが、 >open(ファイルハンドル,$fname) >while(<ファイルハンドル>){ >$test =~ s/¥"/¥&quot¥;/g; 私の認識では、「s/"/&quot;/g;」ではと思うのですが、 「¥」はどのような意味なのでしょうか 以下、3行も同じ疑問です。 >$test =~ s/&/\&testmp\;/g; >$test =~ s/¥</¥&lt¥;/g; >$test =~ s/¥>/¥&gt¥;/g; >print $_; >} 書籍で上記のソースを見たのですが、 HTMLのフォームのテキストボックスに、「"<&>"」と入力し submitボタンで、上記コードを含む、cgiを開きます。 そして、「"<&>"」を受取っても正しく、置換し、 cgiから、HTML($fname)を開くプログラムです。 置換後のHTMLファイルには、「"<&>"」と表示されます。 以上、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • C++ ini 書き込みについて

    C++ test.exe起動時に test.iniを作成するソースコードがはいっているのですが 作成できません。 どうすればいいのですか? ※ test.cppには コモンダイアログ「新規作成,名前を付けて保存,上書き保存,・・」 ・ini書き込むためのソース がはいっています。しかし  test.iniを書き込む ソースコードを書いて コンパイルリンクしたのですが test.exeを実行すると test.iniが作成されないので なにかおかしいと思いましたが なにが原因ですか? アップロード:http://www.dotup.org/uploda/www.dotup.org5122680.zip.html (zip 圧縮 アップロード 「パスワード:1012」)

  • CSSで作成したものに組み込むと文字化け

    ここで質問してよい内容でないかもしれませんが、 どのたか教えてください。フリーのCGIを使って(ですから、サポート がなく) テストを行いました。普通に組んでUPした場合は、 送信ボタンをおして、この内容で送信しますか? の文字がきちんとでましたが、それを無謀だと思いながら、 CSSで作ったものにはめこみました。その際、一部文字化けが 発生しました。ですのでCGIは動作していると思い。 文字コードに問題があるのでは?と、確認した所、 文字コードがUTF-8になっているのに対しCGI側はS-JIS になっていました。 これをどちらも変えてみたり試したのですが、 やはり文字化けしたままです。 まったくのド素人なので、無謀だとおもいましたが、 どなたか教えてください。

    • 締切済み
    • CGI
  • Perlの文字コード

    1-2年ほど前、Perl5.8でソース自体をUTF8N(LF)で記述するようになり、 以下のように書いていました。 use utf8; use encoding "utf8"; use Encoding; それからPHPに移り、PHPでは、ソースはEUC-JP、DBもEUC、HTMLに出力する際もEUC-JPで統一していました。 最近またperlを使い出して疑問に思ったのですが、 perlではどのような文字コードで統一すれば一番よいのかということです。 javascriptはUTFだと動作しない端末(ザウルス)などあり、 perlもEUC-JPで統一しようと考えています。 昔、UTF8にこだわったのは、おそらく 「構」という文字は5Cなので、 文字コードによる不具合(ソース,js,cssで)を避けるためと、流行のUTF8にしたと思います。 perlでEUC-JPで文字コード統一させるメリットデメリットが知りたいです。 最近perlで書かれたサイトでHTML出力がShift_JISだったのですが、perlソースもシフトJISかは知りませんが、Shift_JISで統一するデメリットが知りたいです。 あと、WEBでどの文字コードが現在主流で、今後どうなるかも知りたいです。 EUC-JPで安泰なら、話は早いですが・・・

    • ベストアンサー
    • Perl
  • ASP(VB)にて動的に作成したPDF(stream)をZIPへ格納後の展開ができない

    ASP(VB)にて動的に作成したPDF(stream)をZIPへ格納後、ダウンロードのプログラムを組んだのですが、ダウンロード後にZIPの中を展開するとPDFが 「ファイルの種類がサポートされていないか、または破損している可能性があります。例えば電子文書として送信され、正しくデコードされなかったことなどが考えられます。」 と表示されて開けません。 バイト数・圧縮率は正しく表示されているのですが何かソースとしてエンコード/デコード方法が足りてないのでしょうか? ご教授お願いします。 以下ソースです。( Ionic.Zip.dll使用) Dim teststream As Stream Dim streamRE As StreamReader = New StreamReader(\"C:\\test2.txt\") teststream = streamRE.BaseStream Response.Clear() Response.ContentType = \"application/zip\" Response.AddHeader(\"content-disposition\", \"filename=data.zip\") Dim zip As Ionic.Zip.ZipFile = New Ionic.Zip.ZipFile(Encoding.GetEncoding(\"shift_jis\")) Using (zip) zip.AddEntry(\"データ1.pdf\", \"\", teststream) \'ダウンロード出力 zip.Save(Response.OutputStream) End Using

  • ASP:動的に作成したPDFをアシュクしてダウンロード後の展開

    ASP(VB)にて動的に作成したPDF(stream)をZIPへ格納後、ダウンロードのプログラムを組んだのですが、ZIPの中を展開するとPDFが 「ファイルの種類がサポートされていないか、または破損している可能性があります。例えば電子文書として送信され、正しくデコードされなかったことなどが考えられます。」 と表示されて開けません。 バイト数・圧縮率は正しく表示されているのですが何かソースとしてエンコード/デコード方法が足りてないのでしょうか? ご教授お願いします。 以下ソースです。( Ionic.Zip.dll使用) Dim teststream As Stream Dim streamRE As StreamReader = New StreamReader("C:\test2.txt") teststream = streamRE.BaseStream Response.Clear() Response.ContentType = "application/zip" Response.AddHeader("content-disposition", "filename=data.zip") Dim zip As Ionic.Zip.ZipFile = New Ionic.Zip.ZipFile(Encoding.GetEncoding("shift_jis")) Using (zip) zip.AddEntry("データ1.pdf", "", teststream) 'ダウンロード出力 zip.Save(Response.OutputStream) End Using

  • CGI(Perl)の取り扱いについて

    Macを使用しております。 現在、FlashサイトでCGIを利用したメールフォームを作成中なのですが CGIへの受け渡しの段階で、フォームがうまく動作してくれません。 プログラミングの知識が無いため、CGIファイルそのものは サンプルサイトからダウンロードさせて頂いたものです。 そこで、Macに詳しい方にお聞かせ願いたいのですが 書類の文字コード/改行コードの設定、保存時の設定、設置場所、 最適なテキストエディターやFTPソフトなど、Mac上でCGIを扱う 場合の注意点やアドバイスがありましたら宜しくお願い致します。 また、サイト自体の文字コードは「UTF-8」に設定しておりますが CGIファイルなど、文字コードは全て統一しなければなりませんか? 初歩的な質問かとは思いますが、何卒よろしくお願い致します。

    • ベストアンサー
    • CGI
  • アンケートフォームなどの送信ボタンを押すとソースコードが表示されてしま

    アンケートフォームなどの送信ボタンを押すとソースコードが表示されてしまいます。 初めまして、CGI初心者です。 色々な場所で調べてみた結果、いまいち明瞭な答えにたどりつかなかったので、 質問いたしました。 現在、WindowsXPにて、Perl(ver5.10.1)を使用したCGIを作ろうと思っています。 その中で、フォーム内容を記述して送信を押した場合に次のページに飛んだときに、 cgiのソースコードが表示される状態になってしまいます。 動作確認には、Apache2.2を使用しております。 例えば、単純にフォームに入力したものを次のCGIで表示するものを作った場合、 (sample_form.html) <form action=print.cgi target=_blank method=get> <input size=70 type=text name="input" value="sample text"> <input type=submit value="送信"> </form> は、正常にフォームが表示されますが、送信を押した場合に (print.cgi) #!/perl/bin/perl print "Content-type: text/html\n"; print "\n"; print "REQUEST_METHOD : $ENV{'REQUEST_METHOD'}<br>\n"; print "QUERY_STRING : $ENV{'QUERY_STRING'}<br>\n"; のようなCGI部分は、 CGIとして動作せずソースコードがそのまま表示されてしまいます。 過去ログにあったように Apathの設定関係 httpd.conf に手を加え、cgiを認識させるというような手順や、CGIを認識するディレクトリの変更はすでにしてあります。 それでも解決しませんでした。 あと、別に作ったCGIは普通に動作するという状況です。 フォームからの送信ボタンを押すとソースコードになってしまうのです。 どこに手をつけたらいいのかわからない状況なので、 よろしくお願いいたします。 また、書き足りない情報がありましたらご享受ください。

    • 締切済み
    • CGI