CGIだけどなんか質問ある Pert 5.01
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/03/03 12:49ID:673UxTI5008275とか
02/03/05 02:39ID:???で回避を試みてるっすが、それでもたまに化けることがあるっぺYO!
0083nobodyさん
02/03/05 02:43ID:???と書いておくと、化けない場合が多いZO!!
008475とか
02/03/05 02:44ID:???なるほどー。それってのはつまり
先にjcode.plとかで判定してsjisなら78の処理、
その直後にEUCに変換してデータファイルに書き込みであってるのかYO!
いや、態度でかくてすみません。あってらっしゃいます?いやこれも違うな。
008575とか
02/03/05 02:45ID:???ははは、言えてる。
0086nobodyさん
02/03/05 02:46ID:???チョット進化してきたNA!!
008775とか
02/03/05 02:54ID:???今やってみてるっす。私的な解説サイト参照しながらだからはかどらんス。
ていうか、今思ったけど、携帯専用の書き込みCGI作ったほうが動作確実かな。
しかーし、それはあんまり美しくないのでやはりこのままの方針で..。
008875とか
02/03/05 03:29ID:???なんだか面倒なことになったYO!
今度はIEで携帯からの半角カナが表示できなくなったYO!
IEからの半角も携帯からの半角もデータファイルを
テキストエディタで見れば同様に見えるんだけど、
携帯からの半角だけIEで化けるっす。携帯では化けないっす。
さっき教わったsjis出力時の怪しい変換は削除したっす。
かわりに書き込み前に変換してるっす。
0089nobodyさん
02/03/05 03:32ID:???だいたい以下のようになったDAロ!!
if ("\U$ENV{'REQUEST_METHOD'}" eq 'POST'){
read(STDIN, $_, $ENV{'CONTENT_LENGTH'});
$isSjis= &jcode::getcode(\$_) eq 'sjis' ? 1 : 0;
for ( split('&') ){
($name, $_)= split('=');
tr/+/ /;
s/%(..)/chr(hex($1))/eg;
if ( $isSjis ){
s/([\201-\237\340-\374])([\100-\176\200-\374])/$2eq"\x5c"?"$1\\\x5c":"$1$2"/ge;
s/([\241-\337])([\336\337])/$2eq"\x5c"?"$1\\\x5c":"$1$2"/ge;
&jcode::sjis2euc(\$_);
}
$FORM{$name}= $_;
}
}
009075とか
02/03/05 03:38ID:???でIEでの表示がおかしい以外が一見正常に動いてるっぽく見えるっす。
009175とか
02/03/05 03:40ID:???化ける文字の直後の改行をエディタで入力しなおすだけでIEでも表示できるようになるっす。
これがなにを意味するのか、ちょっとわからんっす。
0092nobodyさん
02/03/05 03:43ID:???if ( $ENV{HTTP_USER_AGENT}=~ /MSIE/i ){ s/\x5c/\\\x5c/g; }
0093nobodyさん
02/03/05 03:46ID:???サーバOSはUNIX系だRO! EUCで処理するぐらいだから当然そうだRO-YO!
009475とか
02/03/05 03:52ID:???で、今バイナリエディタなるものを落としてきて、データファイル見たんだけどYO!
IEでの半角書き込みも携帯の半角書き込みも全く一緒に見えるZOYO?
0095nobodyさん
02/03/05 03:54ID:???009675とか
02/03/05 03:56ID:???>>89のままでバイナリデータ見てもなんら異常あるように見えナインだPPE!
それからIEでだめって言ってたけどYO!ネスケでもだめだっぺ!
0097nobodyさん
02/03/05 04:09ID:???やはりそれも半角だけ化けるんだRO?
つまり半角カタカナがいっぱい化けた感じだと思うGA,
これはSJIS上でEUCコードを見たときに特有のものDA!
でも半角以外の日本語は化けないというのはチョット疑問だZE!
もしかして化けないのはボタン上の文字とかKA?
009875とか
02/03/05 04:14ID:???EUC表示のときに化けるんだZO!
0099nobodyさん
02/03/05 04:16ID:???るが、そこのコードを出しやがレ!!
010075とか
02/03/05 04:17ID:???それ以外の書き込み文字(普通のテキスト)は全部正常なんだZE!
010175とか
02/03/05 04:22ID:???print OUT "$FORM{'name'}\n";
print OUT "$FORM{'message'}\n";
こういうところのことかYO?
0102nobodyさん
02/03/05 04:27ID:???おKE!
s/([\201-\237\340-\374])([\100-\176\200-\374])/$2eq"\x5c"?"$1\\\x5c":"$1$2"/ge;
#s/([\241-\337])([\336\337])/$2eq"\x5c"?"$1\\\x5c":"$1$2"/ge;
010375とか
02/03/05 04:30ID:???010475とか
02/03/05 04:34ID:???0105nobodyさん
02/03/05 04:35ID:???そういうデータの書き方かYO!
直前にアクセスした一件分だけ保存してるということだNA!!
この一旦保存したデータを読み込んで出力してるなら当然改行文字を切り落として
いると思うがどうDA!!
$FORM{'message'}っつーのはテキストエリアで複数行書けるんじゃないのKA?
010675とか
02/03/05 04:42ID:???messageはテキストエリアだYO!これもまずったKAYO!
0107nobodyさん
02/03/05 04:45ID:???とりあえずデータファイル読み込んだら改行を切り落とし過ぎるぐらいに切り落とせ!
テキストエリアデータの改行処理はどう処理してるのKA?
s/[\x0a\x0d]+/<BR>/g;
ってな感じか?
010875とか
02/03/05 04:52ID:???テキストエリアはYO!一行ずつ
print "$_<br>\n";
ってやってるだけだYO!悪いかっ!
010975とか
02/03/05 04:57ID:???0110nobodyさん
02/03/05 04:58ID:???なんでくっつくんだ!
1行ずつ読み込んでるだRO!
テキストエリアの出力にしても今一ついかしてネーゼ!
ソースを公開できる環境があればアドレスを書け!!
0111nobodyさん
02/03/05 05:09ID:???をみみを揃えてだしやがれ!!
011275とか
02/03/05 05:20ID:???見れ!
0113Name_Not_Found
02/03/05 05:39ID:???011475とか
02/03/05 05:43ID:???0115nobodyさん
02/03/05 05:44ID:???# $FORM{'message'} =~ s/\x0D\x0A/\n/g; # 改行コードを統一?動作未確認
# $FORM{'message'} =~ tr/\x0D\x0A/\n\n/;
# $FORM{'message'} =~ s/\r*$//g;
# $FORM{'message'} =~ s/ +/ /g;
やっとだいたいわかったZE!!
まず、上の行まで行って待っていRO!
011675とか
02/03/05 05:47ID:???意味わかんねーYO!
0117nobodyさん
02/03/05 05:48ID:???$SEPA= '^K'; ## ADD NEW
$FORM{'message'}=~ s/[\x0a\x0d]+/<BR>/g; ## ADD NEW
open(OUT, "> wwwboard.tmp");
print OUT join($SEPA,"$yy年$mm月$dd日","$jj時$ff分$bb秒",$FORM{'from'},$FORM{'message'},"\n"); ### ADD NEW
=comment1
print OUT "$yy年$mm月$dd日\n";
print OUT "$jj時$ff分$bb秒\n";
print OUT "$FORM{'from'}\n";
print OUT "$FORM{'message'}\n";
print OUT "<!-- end of comment -->\n";
=cut
0118nobodyさん
02/03/05 05:49ID:???オマエのファイルに同じ部分があるだRO-!
012075とか
02/03/05 05:56ID:???ただ、うまくねーNA!
0121nobodyさん
02/03/05 05:56ID:???open(OUT, "> wwwboard.tmp");
print OUT "$yy年$mm月$dd日\n";
print OUT "$jj時$ff分$bb秒\n";
print OUT "$FORM{'from'}\n";
print OUT "$FORM{'message'}\n";
print OUT "<!-- end of comment -->\n";
0122nobodyさん
02/03/05 05:58ID:???念のために残しているこのおくゆかしさってなもんDA!!
0123nobodyさん
02/03/05 05:59ID:???まだつづくからYO!!
油断すんな!!!
012475とか
02/03/05 06:03ID:???こうなるとYO!
データファイルの構造が変わるべNA!
0125nobodyさん
02/03/05 06:03ID:???open(IN, "wwwboard.dat");
while (<IN>){
print "<div align=\"left\" class=\"normal\">\n";
$date=$_; $time=<IN>;
$from=<IN>;
chomp($from);
0126nobodyさん
02/03/05 06:05ID:???そうDA!!
1行に1データを書くからナ!
よく気づいたナー!!
0127nobodyさん
02/03/05 06:08ID:???これで最新データの取得ダゼ!!どうだいかしてるDARO? 一応、変数名は整合性がとれる
ように合わしてやったからヨー
chop($_=<IN>);
($date, $time, $from, $_)= split($SEPA, $_, 4);
012875とか
02/03/05 06:09ID:???実はYOー!この掲示板にはYO!もう一つ秘密のモードがあってYO!
そっちでもっとめんどくさいことになってるんだっPE!!
データ構造変えない方法はないかYO!
またはよ、データ内にタグを書かない方法はないかYO!
ないならしょうがないから秘密モードの仕様変更するからいいけどYO!!!
0129nobodyさん
02/03/05 06:09ID:???0131nobodyさん
02/03/05 06:14ID:???もちろんまだつづくけどヨー!
やめるんならいまのうちだZE!
やるんなら読み書きぐちをチョット変更して同じ変数にぶち込んで出力も同じようにする
だけだから難しくはないだローヨ!
それとも大事なデータが既に大量に存在するとかKA?
013275とか
02/03/05 06:15ID:???013375とか
02/03/05 06:17ID:???0134nobodyさん
02/03/05 06:20ID:???print qq(<div align="left" class="normal">\n);
s/</</g; s/>/>/g;
print "$_<br>\n";
print qq!<div align="right" class="small">$from $date($time)</div>\n!;
print qq(<img src="graphics/dot.gif" height="30">\n);
これが終わったら whileループの読み出し・出力が終わったことになるからヨー!
またコメントししておけ!!
013575とか
02/03/05 06:22ID:???0136nobodyさん
02/03/05 06:23ID:???013775とか
02/03/05 06:25ID:???0138nobodyさん
02/03/05 06:26ID:???if ($QUERY{'page'}==0) { #ページ指定がなければ発言リストを出力
$title = "<div align=center>最新の15件</div><br>";
&jcode::convert(\$title, 'sjis','euc');
print "$title";
$end_count=0;
while(<IN>){
013975とか
02/03/05 06:32ID:???0140nobodyさん
02/03/05 06:32ID:???while(<IN>){
chop($_=<IN>); ### ADD NEW
($date, $time, $from, $_)= split($SEPA, $_, 4); ### ADD NEW
# $date=$_;
$date =~ s/(\d+)年(\d+)月(\d+)日/$2月$3日/g;
# $time=<IN>;
$time =~ s/(\d+)時(\d+)分(\d+)秒/$1時$2分/g;
# $from=<IN>;
# while (1) {
# $_=<IN>;
# if ($_ =~ /^<!-- end of comment -->/) {last;}
# }
014175とか
02/03/05 06:35ID:???0142nobodyさん
02/03/05 06:40ID:???チョット間違いDA!!
chop($_=<IN>); ⇒ chop;
たまにはわざと間違うからYO-!
014375とか
02/03/05 06:40ID:???014475とか
02/03/05 06:42ID:???0145nobodyさん
02/03/05 06:48ID:???面倒だから字下げは省略だ!
} else { #ページ指定があれば指定ページまで飛ぶ
if ($QUERY{'page'}>15) {$QUERY{'page'}=15};
$end_count=0;
while(1){
if ($end_count>=($QUERY{'page'}-1)){
last;
}
0146nobodyさん
02/03/05 06:50ID:???while(1){
if ($end_count>=($QUERY{'page'}-1)){
last;
}
$_= <IN>; $end_count++; ### ADD NEW
# if (<IN> =~ /^<!-- end of comment -->/) { # コメントの終端を判定
# $end_count++;
# }
}
014775とか
02/03/05 06:55ID:???0148nobodyさん
02/03/05 06:56ID:???これで else ブロック内まで書き終わったことになるから覚悟しRO!
chop; ### ADD NEW
($date, $time, $from, $_)= split($SEPA, $_, 4); ### ADD NEW
s/</</g; s/>/>/g; ### ADD NEW
=comment3
$date=<IN>;
$time=<IN>; #時間(使わない)
$from=<IN>;
while (1) {
$_=<IN>;
if ($_ =~ /^<!-- end of comment -->/) {last;}
=cut
&jcode::convert(\$_, 'sjis','euc');
=comment4
$_ =~ s/<!--/<!--/g;
$_ =~ s/-->/-->/g;
$_ =~ s/&/&/g;
$_ =~ s/"/"/g;
$_ =~ s/</</g;
$_ =~ s/>/>/g;
print "$_<br>\n";
}
=cut
&jcode::convert(\$from, 'sjis','euc');
print "$_<br>\n"; ### ADD NEW
print "<div align=\"right\">$from</div>\n";
0149nobodyさん
02/03/05 07:00ID:???まあ、実際に動作させてないから間違ってるかもしれんがそこはご愛嬌!!
こっちのサーバ立ち上げるのもめんどいし、そう間違ってもいないダロウ!!
ポジィティブシンキングってやつだ!!
だた、最後にこれだけは言わせてもらうからナ!!
言葉遣いが荒っぽくて御無礼お許しください。(ペコリッ
015075とか
02/03/05 07:08ID:???大変勉強になりました。訂正前に比べて、非常に美しい形になりました。
まだ、ちょっと意味不明なところもありますが、調べればすぐわかりそうな位
簡潔ですね!!
0151nobodyさん
02/03/05 07:15ID:???Perl苦手みたいネ!!
かなり無駄な部分が見うけられるからもっとスッキリしたコードに
なるはずです。
015275とか
02/03/05 07:17ID:???完成したら是非見に来て欲しいので、よろしければメールください。
さっきのソースの最後のメールアドレス、残ってるかな?
まあいいや。気が向いたらよろしくお願いします。
本当にありがとうございました!
これから仕事に出かけます..(鬱)。
015375とか
02/03/05 07:23ID:???とほほさんのばっか参考にさせてもらってたので、他の人のソースはかえってムズカシイっす。
本一冊買おうかな。
では、お出かけします。あー眠い。
0155nobodyさん
02/03/05 09:11ID:???他人にみやすく、時間がたった後の自分にみやすく、メンテや機能追加のしやすいコーディングをするっていう方針は間違ってるかなあ?
0156nobodyさん
02/03/05 11:47ID:???0158プリクラ
02/03/05 21:46ID:zRZgn879if ($tagkey) { $value =~ s/<>/<>/g; }
else {
$value =~ s/\&/&/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
}
となってるんですけど、どうしてこれが機能するかわからんです。
正規表現の置換って s/★/☆/g で★が☆に変換されるってことじゃないのです?
だとするとなんで$value =~ s/<>/<>/g;でタグが許可されるのか
わかんないよ。
0159nobodyさん
02/03/05 21:51ID:???else以下だとタグを全て&;lt;などに変換している。
$value =~ s/<>/&;lt;&;gt;/g;では<>がセットになっているときだけしか変換をしない。
つまり、<b>の場合、<>の間にbが入っているからマッチングしない。
0160nobodyさん
02/03/05 21:53ID:???下2行は無駄。あ、HTMLにしたから&ltが<に化けてるのか。
<を&ltに変えればそれはHTMLタグではなくなる。
<html>
<html&rt -ブラウザでは-> <html>と見える。
016175とか
02/03/05 22:06ID:???おかげさまでYO!ソースはかなり見栄えよくなって、秘密モードも対応できたんだけどYO!
肝心の文字化けは全く解決しなかったPPE!!!
でYO!携帯携帯とか言ってパケット料金無駄づかいしてテストしてたKEDO!
携帯ページにIEで行って(sjisフォームで)書き込んでも文字BAKEdaZEYO!
フリダシに戻ったっPE!!気づいたらレスくれYO!!!
0163nobodyさん
02/03/05 22:29ID:uMIlDzWPって何か間違ってる?
0165nobodyさん
02/03/05 22:58ID:???sub ab { "ab" }
0168お腹さん@名無しいっぱい。
02/03/05 23:27ID:???呼んだ?
016975とか
02/03/05 23:43ID:???>>161のとおりなんだけども!ウザいとか言われてへこむから、
なんか端的な解決策あったらお願いしますYO!!!!!!
0170お腹さん@名無しいっぱい。
02/03/06 00:11ID:???そうさネー。もっとスクリプトを整理することサネー。
チョット仕様がわかりかねる部分があるケド、MODEがcomment,light,cellular の
3つがあってcommentモードは print "Location: "; exit; で終わってるのはどう
いう処理?
017175とか
02/03/06 00:19ID:???もっと簡潔な処理できますね。
でも、どうやらもっと別の要因の気がします。
今、フォームデコードする直前あたりからEUCに変換するまでをバイナリで
丹念に調べてます。
0172お腹さん@名無しいっぱい。
02/03/06 00:25ID:???Location: でパラメータを渡さずにこのCGIを呼ぶならどれも実行されないような
気もするケド。。。最終的にLocation: http://xxxxxxx の指定を書くというこTO?
017375とか
02/03/06 00:29ID:???引数なければそっちに行くんです。だから、Locationで飛ばさなくていいんですよね。
なんでそんなことしてたんだろう。
0174お腹さん@名無しいっぱい。
02/03/06 00:32ID:???017575とか
02/03/06 00:57ID:???昨日教わったフォームデータを受けてるところ、調べてみたら
同じアという文字をEUCとsjisで送信すると
EUCでは%8E%B1を受け取ってデコード直後から最後まで8Dになってます。
sjisでは%B1を受け取って最後までB1のまま。
&jcode'convert(*value, "euc",$form_code,"z");
とか
&jcode'h2z_sjis(*value);
って文法間違ってないですよね??
0176お腹さん@名無しいっぱい。
02/03/06 00:59ID:???if ($in{'mode'} eq "comment" && $in{'message'} ){
commentモード処理;
exit;
}
if ($in{'mode'} eq "light"){
ligntモード処理;
exit;
}
if ($in{'mode'} eq "cellular"){
ligntモード処理;
exit;
}
※ 現在、大まかに上の処理の流れになっているのでif文がそれぞれ独立していて、
それぞれのブロックが終了したら exit; で処理が終了してしまう。つまり、
2つのifブロックを実行することはありえないし、パラメータによってはどの
ifブロックも実行しないでなにも返さないCGIになってしまい、スクリプトエラー
になると思う。したがって、大枠としては以下のように書き替えたほうがいいの
では?
;# URLデコード処理実行
if ($in{'mode'} eq "comment" && $in{'message'} ){
commentモード処理;
}
elsif ($in{'mode'} eq "light"){
ligntモード処理;
}
elsif ($in{'mode'} eq "cellular"){
ligntモード処理;
}
else { デフォルト処理;}
017775とか
02/03/06 01:02ID:???0178お腹さん@名無しいっぱい。
02/03/06 01:07ID:???別に半角のままでも化けないかもわからないので、まず処理構造をスッキリ
スマートにさせたほうが分かり易くなると思う。
少し読み進めてみると、ファイルロックはしないようにしたみたいダケド、ロックファイル
の後始末(アンロック)などが残っているのでこれは削除したラ?
0179お腹さん@名無しいっぱい。
02/03/06 01:10ID:???付加しないと動かないとかとほほに書いてあったようなきがするケドドウ?
018075とか
02/03/06 01:15ID:???関係なさそうだったのでカットしただけです。
デフォルト処理はif文無しなので、変なパラメータならデフォルトが実行されます。
これ、とほほさんのラウンジの構造そのものなんですが(笑)。
でも全部elsifで繋いだほうが後始末何度も書かなくて済むのでより簡潔ですね。
変更します。
■ このスレッドは過去ログ倉庫に格納されています