まだまだ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/&/&/g; 直す以前に化けてますが…
$value =~ s/</</g; この最後で指定をしてます。
$value =~ s/>/>/g;
$value =~ s/\x0D\x0A/<br>/g;
$value =~ tr/\t/ /;
$FORM{$key} = $value;
}
}
cgiの一番最後の方に書いてあるのですがこの本にはこれしか書いて無くて、
他のサイト様だと何だか全く違う表現が一般的?jcode::convert(\$value,'euc');
これでもさっぱりダメでした…
ちなみにブラウザもしっかりとHTMLに指定しているeuc-jpで表示しております。
あと既に送信してから仮保存ディレクトリの中のだんかいで既に文字化けしております。
このプランしか知らないものでどこをどういじれば良いのかがさっぱりわかりません…
使用エディタはTeraPadで、euc-jp書き出し、保存に設定しています。
良い解決策が有ればよろしくお願い致します
No.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;
にしたらどうなりますでしょうか?
上記修正をして、XHTML1.0をHTML4.01にしたらちゃんと表示するようになりました。やはりXHTMLという性質上CGIには組み込めないのでしょうか??
$value =~ s/\x0D\x0A/<br>/g;
これをXHTMLの<br />に換えるとエラーが出てしまいました。
もう少ししっかり勉強してみようと思います。
参考書、購入の際には参考にさせていただきます。
ありがとうございました。
No.1
- 回答日時:
まず、確認ですが
http://www.seshop.com/product/detail/6160/
この本でしょうか?
私は未見ですが、2005年となると、既に古くて現状に合っていないと思われます。
まずは、新しい本で、Perl、CGI、HTMLそれぞれ基本を身につけるのが先ではないでしょうか。
> require "jcode.pl";
jcode.pl は現在でも一部では使われていますが、既に古いやりかたとなっています。
Jcode.pmモジュールを経て、現在は標準のEncodeモジュールを使うのが基本です。
回答ありがとうございます。
やはり古いですよね…
その本です。だいぶ前に買ってそろそろHTMLCSS当たりが
ある程度使えて来てるのでそろそろCGIでもやろかと、未使用のこれにてやっておりました。
やはり新しい本を買った方がよいのでしょうかね?
いまはEncodeということでそのあたりで対処出来るか調べてみます。ちなみにPerlの記述自体には新しいとか古いとかあるんですかね?
ありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
ラズパイで感圧センサーを動か...
-
【C#】数値の範囲チェックについて
-
Application.ScreenUpdating = ...
-
formで特定のinputを送信しない...
-
<SELECT>タグの折り返し
-
16進の10進変換について
-
実行時エラー 3020の対策
-
文字の横にプルダウンを表示さ...
-
デ-タテ-ブルの内容での更新...
-
セレクトメニューで2つの項目...
-
数値英単語変換
-
セレクトボックスのselected属...
-
複数列を持ったリストボックス...
-
selectタグ内の特定のoptionの...
-
【メモリ不足で落ちる(python)】
-
STLのlistで重複するものだけを...
-
【至急!!!】python言語で本を見...
-
パイソンのクラスについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
フォームで入力した値を表示し...
-
【C#】数値の範囲チェックについて
-
ラズパイで感圧センサーを動か...
-
linq で 楽天ウェブサービスのX...
-
Perlでアルファベットを数...
-
CGIでのページ指定~その(2)
-
途中まで出来ているのですが‥(D...
-
CGIやPHPで外部ファイルの内容...
-
CGIからメールに書き出しする際...
-
デコードできない時があります><
-
gpioを使ってSPIをシミュレーシ...
-
フォームのINPUT NAM...
-
map(STL)でinsertを行いたいで...
-
Application.ScreenUpdating = ...
-
どちのほうがすきですか?
-
formで特定のinputを送信しない...
-
文字の横にプルダウンを表示さ...
-
16進の10進変換について
おすすめ情報