• ベストアンサー

perlの挙動について

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

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

  • ベストアンサー
  • kichi8000
  • ベストアンサー率41% (660/1584)
回答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