トップページ⇒php
1001コメント310KB

CGIだけどなんか質問ある Pert 5.01

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/03/03 12:49ID:673UxTI5
print"くだらない質問はここにかけや!";

0051名無しさん@お腹いっぱい。02/03/05 00:28ID:???
テスト書きこみ
0052nobodyさん02/03/05 00:30ID:???
>49
http://www.din.or.jp/~ohzaki/perl.htm#JP_HK2ZK
0053nobodyさん02/03/05 00:45ID:kLevaTw3
>>52
そこは参考にさせてもらってるっすが、そのサイトのどこを見たらいいすか。
正しくパターンマッチさせるとか怪しいっすが、パターンマッチとか使ってないし。
0054nobodyさん02/03/05 00:48ID:???
>53
わざわざ何処を見るかまで教えてるじゃないか・・・。
0055nobodyさん02/03/05 00:52ID:???
>>54
釣られるなよ。
0056nobodyさん02/03/05 00:53ID:???
> 49
その価値のないソースを見せてみRO!
0057nobodyさん02/03/05 00:56ID:kLevaTw3
おっと、失礼しました。半角を全角にっすか?
それは、convertだかのオプションですでにやってだめで、
今、h2z_eucというのもためしてみたっすが、うまくいかんす..。
ていうか、WINやマックの半角はよくて携帯はだめってどういう仕組みっすか?
0058nobodyさん02/03/05 00:58ID:???
>57
送信の文字コードはなんなんだYO!
0059nobodyさん02/03/05 01:01ID:kLevaTw3
送信元はなんなんだかわからんっす!AUとドコモで試してるっす。
convertで第2引数は指定しなきゃいいかと思ってたっす。
頭悪くてすまんす。
0060nobodyさん02/03/05 01:08ID:???
おっと、すまんす。ちょっと試験の仕方を間違ったっす。
h2z_eucを再チェックしてみまっす。
0061nobodyさん02/03/05 01:16ID:???
>59
なに勘違いしてんだYO!
サーバ側からの送信文字コードだYO!
携帯だからSJISしか使えないはずだから確認したかったんだYO!
0062nobodyさん02/03/05 01:22ID:???
すまんす。意味わからんかったっす。
携帯にはSJISで出力してるっす。表示部には問題ないと思うっす。
なんか携帯のフォームからデータ受け取った時点ですでにおかしいっぽい。
0063nobodyさん02/03/05 01:24ID:???
URLデコードの部分を見せてみRO!
0064nobodyさん02/03/05 01:32ID:???
URLデコードっていうのかわからんっすが..こんな感じっす。
if ($ENV{'REQUEST_METHOD'} eq "POST") {
  read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
  @a = split(/&/, $query_string);
  foreach $x (@a) {
   ($name, $value) = split(/=/, $x);
   $value =~ tr/+/ /;
   $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
   &jcode'convert(*value, "euc","","z");
   $FORM{$name} = $value;
  }
}
....
print OUT "$FORM{'name'}\n";#ファイルに書き込みね☆
0065nobodyさん02/03/05 01:35ID:???
>63
>携帯にはSJISで出力してるっす。

ってことは、携帯以外には別のコードってことKA?
そしたら改行コードの統一ってのが不可欠になってくるけどどんな感じDA?
0066nobodyさん02/03/05 01:39ID:???
ていうか、パターンマッチばりばりしてるっぺな..。
改行コードか..。そういえば、パールメモからコピペして使ってたなあ。
全然チェックしてなかったっす。ちょっとチェックしてみるっす。
いろいろ世話になるっす。ありがとう。
0067nobodyさん02/03/05 01:46ID:???
んー待てよー。
でも<input type="text">からのデータには改行は入ってないっぺ?
これも化けるんだけど、改行コード関係あるっぺか?
0068nobodyさん02/03/05 01:48ID:???
ないネー。
半角以外の漢字コードは問題ないのKA?
0069nobodyさん02/03/05 01:50ID:???
<input type="text" .......
の場合、type="text"部分は省略できるZO!
携帯のようにバイト数に制限があるならより少なく書くのがよかろう!
0070nobodyさん02/03/05 01:54ID:???
んー今のところ、携帯で半角カナ意外では問題ないっす。
あ、ドコモのやたらと古い機種(関係あるのかわからんが)で、
(涙)みたいな意味の記号が化けたことがあったすけど、
原因がいっしょだか不明っす。
見切り公開してしまった掲示板す。どんどんバグがあらわに..。
0071nobodyさん02/03/05 01:57ID:???
>69
おお、それは知らなんだ!予期せぬ有用な情報をありがとう!!
0072nobodyさん02/03/05 02:00ID:???
最後にHTMLフォームをSJISで出力する際に、つぎをかませたらどうDA?

s/\x5c/\\\x5c/g;
0073nobodyさん02/03/05 02:08ID:???
おお、なんじゃそりゃ。
ホント頭悪くてすまないんだけど、なんか、携帯で半角カナで書き込んだら
データファイルの中も様子がおかしくて、携帯にsjisで表示しようが、
IEとかにEUCで出力しようが同様に化けるっす。
IEで半角カナ打った場合はIEでも携帯でも表示はノープロブレム。
これは携帯の電波に特殊な妨害電波が混じってるとしか思えん!そんな俺がデムパか。
てか、蓋を開けてみたら半数以上の訪問者が携帯から書き込みやがるし..。
0074nobodyさん02/03/05 02:14ID:???
s/\x5c/\\\x5c/;
ってのは、あくまでもSJISのみに適用DA!
0075nobodyさん02/03/05 02:19ID:???
おお!なるほど!!
って全然意味不明っすが、たしかに携帯でのみ化けなくなったっす。
007675とか02/03/05 02:21ID:???
やっぱデータ受け取った直後のパターンマッチかな?
0077nobodyさん02/03/05 02:23ID:???
SJIS以外の送信フォームが文字化けなら元データが既に汚染されてはいないKA?
0078nobodyさん02/03/05 02:29ID:???
急きょ以下を作ってみたから s/\x5c/\\\x5c/g;のかわりに次を使ったほうが
より化けないと思うZO!

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;
007975とか02/03/05 02:30ID:???
いや、SJIS以外のフォームは文字化けしないっす。
sjisフォームから来たデータだけ文字化けして書き込まれて、
さっき教わったやつでsjis出力時(つまり携帯に表示時)だけ元に戻ってるっぽい。
ああ、なんかだんだんわかってきたZO!そんな気がするだけか..。
0080nobodyさん02/03/05 02:33ID:???
>73
IEでの日本語EUCコードの文字化けはメタタグで回避済みKA?
0081nobodyさん02/03/05 02:37ID:???
>79
それだったらURLデコード直後に文字コードがSJISの場合のみ>78の処理を先に
かましておくのはDOUDA!!
008275とか02/03/05 02:39ID:???
メタタグとおまじないの文字(とほほさんのサイトでヤフーも使ってると紹介されてる方法)
で回避を試みてるっすが、それでもたまに化けることがあるっぺYO!
0083nobodyさん02/03/05 02:43ID:???
そういう場合はメタの直後に<!--日本語化けるなゴルァ-->
と書いておくと、化けない場合が多いZO!!
008475とか02/03/05 02:44ID:???
>>81
なるほどー。それってのはつまり
先にjcode.plとかで判定してsjisなら78の処理、
その直後にEUCに変換してデータファイルに書き込みであってるのかYO!
いや、態度でかくてすみません。あってらっしゃいます?いやこれも違うな。
008575とか02/03/05 02:45ID:???
おお!それは知らなんだ!予期せぬ有用な情報をありがとう!!

ははは、言えてる。
0086nobodyさん02/03/05 02:46ID:???
そういうことDAな!
チョット進化してきたNA!!
008775とか02/03/05 02:54ID:???
ありがとーだYO!だんだん分かってきたYO。
今やってみてるっす。私的な解説サイト参照しながらだからはかどらんス。
ていうか、今思ったけど、携帯専用の書き込みCGI作ったほうが動作確実かな。
しかーし、それはあんまり美しくないのでやはりこのままの方針で..。
008875とか02/03/05 03:29ID:???
まだいるかな?
なんだか面倒なことになったYO!
今度はIEで携帯からの半角カナが表示できなくなったYO!
IEからの半角も携帯からの半角もデータファイルを
テキストエディタで見れば同様に見えるんだけど、
携帯からの半角だけIEで化けるっす。携帯では化けないっす。
さっき教わったsjis出力時の怪しい変換は削除したっす。
かわりに書き込み前に変換してるっす。
0089nobodyさん02/03/05 03:32ID:???
当然SJIS出力時の変換はチャラDA!!

だいたい以下のようになった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:???
じゃーYO−! とっておきのスペシャル変換をIEにだけ特別にぶちかましてやんナ!

if ( $ENV{HTTP_USER_AGENT}=~ /MSIE/i ){ s/\x5c/\\\x5c/g; }
0093nobodyさん02/03/05 03:46ID:???
>91
サーバOSはUNIX系だRO! EUCで処理するぐらいだから当然そうだRO-YO!
009475とか02/03/05 03:52ID:???
おおおお!なんだそれーー。なんかわからんがすごそう。
で、今バイナリエディタなるものを落としてきて、データファイル見たんだけどYO!
IEでの半角書き込みも携帯の半角書き込みも全く一緒に見えるZOYO?
0095nobodyさん02/03/05 03:54ID:???
できたってことKA!
009675とか02/03/05 03:56ID:???
いや、できとらんのYO!
>>89のままでバイナリデータ見てもなんら異常あるように見えナインだPPE!
それからIEでだめって言ってたけどYO!ネスケでもだめだっぺ!
0097nobodyさん02/03/05 04:09ID:???
>96
やはりそれも半角だけ化けるんだRO?
つまり半角カタカナがいっぱい化けた感じだと思うGA,
これはSJIS上でEUCコードを見たときに特有のものDA!
でも半角以外の日本語は化けないというのはチョット疑問だZE!
もしかして化けないのはボタン上の文字とかKA?
009875とか02/03/05 04:14ID:???
いや違うんだZO!携帯からの半角文字、一文字なら一文字だけが、
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:???
チョット意味のない処理をしてしまっていたからYO!次の2行の置換は2行目をコメントにして
お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:???
わかったYO!消してみたぜYO
010475とか02/03/05 04:34ID:???
発言者名アってしたら岡だとYO!笑わせるゼ!
0105nobodyさん02/03/05 04:35ID:???
>101
そういうデータの書き方かYO!
直前にアクセスした一件分だけ保存してるということだNA!!
この一旦保存したデータを読み込んで出力してるなら当然改行文字を切り落として
いると思うがどうDA!!
$FORM{'message'}っつーのはテキストエリアで複数行書けるんじゃないのKA?
010675とか02/03/05 04:42ID:???
改行切り落としてないYO!まずったKA?
messageはテキストエリアだYO!これもまずったKAYO!
0107nobodyさん02/03/05 04:45ID:???
>106
とりあえずデータファイル読み込んだら改行を切り落とし過ぎるぐらいに切り落とせ!
テキストエリアデータの改行処理はどう処理してるのKA?
s/[\x0a\x0d]+/<BR>/g;
ってな感じか?
010875とか02/03/05 04:52ID:???
切り落としたらなんかその後の文字とくっ付いたZO!いやー!!
テキストエリアはYO!一行ずつ
print "$_<br>\n";
ってやってるだけだYO!悪いかっ!
010975とか02/03/05 04:57ID:???
やっぱ改行コードがおかしいんKA!
0110nobodyさん02/03/05 04:58ID:???
>108
なんでくっつくんだ!
1行ずつ読み込んでるだRO!

テキストエリアの出力にしても今一ついかしてネーゼ!
ソースを公開できる環境があればアドレスを書け!!
0111nobodyさん02/03/05 05:09ID:???
ソースを公開できる環境がなければデータ書きこみから読み込み終了まで
をみみを揃えてだしやがれ!!
011275とか02/03/05 05:20ID:???
http://blake.prohosting.com/k00lk/bbs_dazo.txt
見れ!
0113Name_Not_Found 02/03/05 05:39ID:???
普通にしゃべれねーのかお前らは(笑)
011475とか02/03/05 05:43ID:???
おろ?寝ちまったかYO!!
0115nobodyさん02/03/05 05:44ID:???
# Write current comment.
# $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!!
意味わかんねー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:???
>116
オマエのファイルに同じ部分があるだRO-!
011975とか02/03/05 05:54ID:???
>>115の5行を>>117の12行に書き換えるってーことKAI?
012075とか02/03/05 05:56ID:???
いや間違ったZO!わかる!わかるぞ!
ただ、うまくねーNA!
0121nobodyさん02/03/05 05:56ID:???
5行じゃネーゼ6行ダゼ! 以下の行を117と置き換えろ!!
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:???
=comment1 から =cut まではコメントだから消してもいいけどYO−!
念のために残しているこのおくゆかしさってなもんDA!!
0123nobodyさん02/03/05 05:59ID:???
書き終わったか?
まだつづくからYO!!
油断すんな!!!
012475とか02/03/05 06:03ID:???
ちょっと待てYO!確認なんだがYO!
こうなるとYO!
データファイルの構造が変わるべNA!
0125nobodyさん02/03/05 06:03ID:???
次に以下の行まで移動してみRO!!

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:???
>124
そうDA!!
1行に1データを書くからナ!
よく気づいたナー!!
0127nobodyさん02/03/05 06:08ID:???
127まで移動したらヨー!ファイル開いた直後に以下を書き足してみろってんDA!
これで最新データの取得ダゼ!!どうだいかしてる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:???
127じゃネーゼ! 125のまちがいサー!!
013075とか02/03/05 06:12ID:???
おっと、しかし、>>127はちょっとイカしてんナ!!
0131nobodyさん02/03/05 06:14ID:???
乗り気じゃネーのKA?
もちろんまだつづくけどヨー!
やめるんならいまのうちだZE!
やるんなら読み書きぐちをチョット変更して同じ変数にぶち込んで出力も同じようにする
だけだから難しくはないだローヨ!
それとも大事なデータが既に大量に存在するとかKA?
013275とか02/03/05 06:15ID:???
$SEPAってなんだよ!!イカしてるゼ、まじ!
013375とか02/03/05 06:17ID:???
いや、つづけてクレ!!こっちのほうが楽そうだZO!!
0134nobodyさん02/03/05 06:20ID:???
127がおわったら、次も書いておく

print qq(<div align="left" class="normal">\n);
s/</&lt;/g; s/>/&gt;/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:???
じゃあwhileループは全部イランということだナ?
0136nobodyさん02/03/05 06:23ID:???
そういうことDA−ZE!
013775とか02/03/05 06:25ID:???
なんかすげーナ!print qqってーのは"の前に\がイランのカ!
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 ループ内は以下のようになるってなもんDA!!

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:???
最初に一行入るだけかYO!
0142nobodyさん02/03/05 06:40ID:???
>140
チョット間違い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:???
はっはっは!すげーすげーZO!!
0148nobodyさん02/03/05 06:56ID:???
146の直後はつぎのようになるからヨーク目をこらして見サラセ!!
これで else ブロック内まで書き終わったことになるから覚悟しRO!

chop; ### ADD NEW
($date, $time, $from, $_)= split($SEPA, $_, 4); ### ADD NEW
s/</&lt;/g; s/>/&gt;/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/<!--/&lt;!--/g;
$_ =~ s/-->/--&gt;/g;
$_ =~ s/&/&amp;/g;
$_ =~ s/"/&quot;/g;
$_ =~ s/</&lt;/g;
$_ =~ s/>/&gt;/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苦手みたいネ!!
かなり無駄な部分が見うけられるからもっとスッキリしたコードに
なるはずです。
■ このスレッドは過去ログ倉庫に格納されています