プロが教える店舗&オフィスのセキュリティ対策術

まだまだperlいじって3,4日の者です。
10日でおぼえる~シリーズの本を買って、現在掲示板を自作しているのですが、
ローカルにApache入れてActivePerlで作ってて、殆ど動作しますし、普通に書き込み
出来るのですが、フォームの文字は普通に出力?されているのですが、
フォームの送信ボタンを押して、下に書きこまれると文字化けして全く読めません…
参考書ではShift_JISで説明が行われていましたが、その通りやってもさっぱり表示が化けて
ネットで色々調べても流石にと言いますかそんな初歩的な事をなかなか見つけられず
困っております。
記述としては


#! c:/perl/bin/perl ↓最初の方で指定して

require "jcode.pl";


#=========================== ユーザー設定 ====
$CHARSET = 'Shift_JIS'; # 文字コード
$DATAFILE = './board.dat'; # 記事ファイル
$PAGEVIEW = 5; # ページ記事数
$MAXLINE = 100; # 最大記事数


#======================= メインプログラム ====
loadFormdata();

# 記事データの読み込み
open(FILE, "<$DATAFILE")
or printErrorPage("記事ファイルが開けません。");
eval{ flock(FILE, 1) };
@DATA = <FILE>;
close(FILE);

if($FORM{'mode'} eq 'write') {
writeArticle(); # 書き込みモード

# 記事データの書き込み
open(FILE, ">$DATAFILE")
or printErrorPage("記事ファイルが開けません。");
eval{ flock(FILE, 2) };
print FILE @DATA;
close(FILE);
}
printPage();
exit;


#========================== 記事ページ出力 ====
sub printPage
{
my $begin = $FORM{'page'} * $PAGEVIEW;
my $end = $begin + $PAGEVIEW;

if($end > @DATA) {
$end = @DATA;
}              埋め込みHTMLは、代入?して ↓   
print <<END;
Content-type: application/xhtml+xml; charset=$CHARSET

<?xml version="1.0" encoding="$CHARSET"?>   ←一応ここも
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head><title>掲示板</title></head>
<body>

 :
:一部割愛


# 記事の出力
my ($i, $nextpage, $nextlink);

for($i = $begin ; $i < $end ; ++$i) {
my ($data, $title, $author, $email, $text)
= split(/\t/, $DATA[$i]);
print "<h2>$title</h2>\n";
if($email) {
print "<strong>";
print "<a href=\"mailto:$email\">$author</a>";
print "</strong>";
}
else {
print "<strong>$author</strong>";
}
print " [ $date ] ";
print "<p>$text</p>";
print "<hr />\n";
}

# 次ページへのリンク
if($end < @DATA) {
$nextpage = $FORM{'page'} + 1;
$nextlink = "$ENV{'SCRIPT_NAME'}?page=$nextpage";
print "<p><a href=\"$nextlink\">NEXT PAGE</a></p>\n";
}

print <<END;
</body>
</html>
END
}

                :
                : 一部割愛
                :

#=============== フォームデータ取り込み =====
sub loadFormdata                   ←取り込み全文     
{                                 ↓
my ($query, $pair);

if($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}
else {
$query = $ENV{'QUERY_STRING'};
}

foreach $pair (split(/&/, $query)) {
my ($key, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F] [0-9a-fA-F])/chr(hex($1))/eg;

$value = jcode::sjis($value); ←出来ればeucに直したい(基本サイトをeuc-jpで作成)
$value =~ s/&/&amp;/g;      直す以前に化けてますが…
$value =~ s/</&lt;/g;              この最後で指定をしてます。
$value =~ s/>/&gt;/g;
$value =~ s/\x0D\x0A/<br>/g;
$value =~ tr/\t/ /;

$FORM{$key} = $value;
}
}
cgiの一番最後の方に書いてあるのですがこの本にはこれしか書いて無くて、
他のサイト様だと何だか全く違う表現が一般的?jcode::convert(\$value,'euc');
これでもさっぱりダメでした…
ちなみにブラウザもしっかりとHTMLに指定しているeuc-jpで表示しております。
あと既に送信してから仮保存ディレクトリの中のだんかいで既に文字化けしております。
このプランしか知らないものでどこをどういじれば良いのかがさっぱりわかりません…
使用エディタはTeraPadで、euc-jp書き出し、保存に設定しています。
良い解決策が有ればよろしくお願い致します

A 回答 (2件)

No.1のkmeeさんが言及されてますように、コードの例がちょっと古いですね。



use strict;
use warnings;

のないコードはまず古いですね。レキシカル変数を使ってスコープを限定しないコードも古いです。リファレンスで済むところを型グロブを使うコードも古いです。

私の所有している本は以下です。

CGIプログラミング
http://www.amazon.co.jp/dp/4873110440

これも古いのですが、まだ通用する本でお薦めです。
ただ、少し難しいかもしれません。

初心者用の良い書籍を紹介できないのが残念ですが、

サンプルコードによるPerl入門
http://d.hatena.ne.jp/perlcodesample/

の木本さんが書かれた

かんたんプログラミング CGI/Perl
http://www.amazon.co.jp/dp/4774139289

なら幾分ましかもしれません。
Perlについてなら定評のある結城浩さんの本がいいのではないでしょうか。

新版Perl言語プログラミングレッスン入門編
http://www.amazon.co.jp/dp/4797336803

上記2点の本は拝見したことがないので、はっきりと推薦はできませんが、お持ちの書籍よりはましかと思われます。

以下のオライリーの本は評価が高いです。かなりやる気があるのならこれがお薦めですが、ご自分で中身を確認されてからご検討ください。

初めてのPerl 第5版
http://www.amazon.co.jp/dp/4873114276

書籍を選ぶ最低限のポイントとしてサンプルコードに

use strict;

の記述があるのをお選びください。

余談はこれぐらいにして(Perlカテゴリで似たような質問があったため御託を並べてしまいました)、質問への回答をしたいと思います。
以下2点、ご確認お願いします。

まず、この↓行を削除(コメントアウト)したらどうなりますでしょうか?

$value = jcode::sjis($value); ←出来ればeucに直したい(基本サイトをeuc-jpで作成)

次に、

loadFormdata();

を、

use CGI;
%FORM = CGI->new->Vars;

にしたらどうなりますでしょうか?
    • good
    • 0
この回答へのお礼

上記修正をして、XHTML1.0をHTML4.01にしたらちゃんと表示するようになりました。やはりXHTMLという性質上CGIには組み込めないのでしょうか??
$value =~ s/\x0D\x0A/<br>/g;
これをXHTMLの<br />に換えるとエラーが出てしまいました。
もう少ししっかり勉強してみようと思います。
参考書、購入の際には参考にさせていただきます。
ありがとうございました。

お礼日時:2011/05/05 19:07

まず、確認ですが


http://www.seshop.com/product/detail/6160/
この本でしょうか?
私は未見ですが、2005年となると、既に古くて現状に合っていないと思われます。

まずは、新しい本で、Perl、CGI、HTMLそれぞれ基本を身につけるのが先ではないでしょうか。

> require "jcode.pl";

jcode.pl は現在でも一部では使われていますが、既に古いやりかたとなっています。
Jcode.pmモジュールを経て、現在は標準のEncodeモジュールを使うのが基本です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
やはり古いですよね…
その本です。だいぶ前に買ってそろそろHTMLCSS当たりが
ある程度使えて来てるのでそろそろCGIでもやろかと、未使用のこれにてやっておりました。
やはり新しい本を買った方がよいのでしょうかね?

いまはEncodeということでそのあたりで対処出来るか調べてみます。ちなみにPerlの記述自体には新しいとか古いとかあるんですかね?

ありがとうございました

お礼日時:2011/05/05 16:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!