- ベストアンサー
perlの挙動について
http://yowyow.sakura.ne.jp/test/http.cgi httpのレスポンスを確認するための動作をテストしていたところ 上記で送信ボタンを押すと処理が行われた後に、要素が一つ認識されなくなります 文字コードの問題かと思ってutf-8に変換しても同様の結果でした 以下にソースを圧縮したものを置いてあります http://yowyow.sakura.ne.jp/test/test.zip 何が悪いのか教えていただけますでしょうか・
- みんなの回答 (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宣言はいらない。
お礼
回答ありがとうございました(`・ω・´)