自分で作成したCGIで送信されてきたフォームデータを
取得し、テキストファイルに出力するような処理をやってまして、
その送信されるデータにはTEXTAREAで入力されたデータもあります。

CGIの処理後に出力されたファイルをテキストエディタで開こうしたら、
テキストエディタでオープン不正であるようなメッセージが表示されました。
自分でもその原因についてバイナリエディタで調べたところ、
TEXTAREAで改行されたところに不正なゴミコードが混ざっているようでした。

改行コードは16進数でいうと「0D0A」のはずですが、バイナリファイルで
みたところ改行部分が「0D0D0A」となっているようで、どうやら「0D」の余計な
コードがテキストエディタで開いた時、エラーを発生させている原因となってるようです。
CGIの処理内でこの「0D」コードを削除する処理をいれるのもいいんですが、
なにか簡単にこの「0D」というゴミコードを取り除きたいのですが、
ナニかいい方法ないでしょうか?

A 回答 (1件)

Perlの場合ですが、デコードのついでに



$value =~ s/\r\n/\n/g;
$value =~ s/\r|\n/\n/g;
$value =~ s/\n/<BR>/g;

とかよくやりますよね。
C/C++、Rubyなどで書かれたものについてはわかりませんが。

そうするつもりで書いたコードが、まちがってるんじゃないでしょうか?
またはファイルへのprintミスではないでしょうか。
    • good
    • 0
この回答へのお礼

早速のアドバイスありがとうございます。
コメントいただいた後に、デコード処理周辺を調べてましたら、
やはり処理内でバグがあったようです。
TEXTAREA内での改行コードもそのまま「%0D%0A」の文字列として
取り込まれるようですね。これを無理にデコードさせたために
生じたバグのようでした。
自分が作ったCGIはCで作成したものなので、このようなバグが
生じたんでしょか???
おかげ様でバグ解決いたしました。また何かありましたら宜しくお願い致します。

お礼日時:2001/03/30 00:18

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QHTMLにcgiを使って表示していますが、TEXTAREAの改行ができません

今、ホームページの作成をしています。
その際入力の画面で送信ボタンを押すと、cgiを使って入力確認の画面を
表示するようにしたいのですが、入力画面のTHML言語でTEXTAREAを使うと
その後の入力確認画面で入力通の改行ができません。
入力確認画面のソースを表示すると、入力画面で指定した箇所で改行はされているようなのですが、各行の最後にHTMLLの改行タグ<BR>が表示されていません。
改行タグを各行ごとに入れられれば良いのですが、どうしてもやり方が
わからないので、良いやり方があれば教えていただけませんか。
cgi上ではC言語を使い、ホームページを表示しています。
よろしくお願いします。

Aベストアンサー

補足読みました。
こんな感じですかね?
szInputが送られてきた文字列、szOutputが出力するためのデータです。

j= 0;
memset(szOutput, 0, strlen(szOutput));
for(i = 0; szInput[i] != NULL; i++) {
 if(szInput[i] == '\n') {
  szOutput[j++] = '<';
  szOutput[j++] = 'B';
  szOutput[j++] = 'R';
  szOutput[j++] = '>';
  szOutput[j++] = '\n';
 } else {
  szOutput[j++] = szInput[i];
 }
}
szOutput[j] = '\0';

まぁ、これだと\rの問題が出てくるので、そこら辺はご自分で考えてください。おそらくANSIでも問題なく通るはずです。

また、無制限の文字列にはこれではうまく対応できないと思うので、その場合はmallocか何かであらかじめ動的なメモリ領域を確保/初期化する必要がありますね。

また、HTMLの性質上、インデントは全角スペースでやっているので、コピー&ペーストはできませんので、注意してください。

間違いがありましたらご指摘ください。
ではでは☆

補足読みました。
こんな感じですかね?
szInputが送られてきた文字列、szOutputが出力するためのデータです。

j= 0;
memset(szOutput, 0, strlen(szOutput));
for(i = 0; szInput[i] != NULL; i++) {
 if(szInput[i] == '\n') {
  szOutput[j++] = '<';
  szOutput[j++] = 'B';
  szOutput[j++] = 'R';
  szOutput[j++] = '>';
  szOutput[j++] = '\n';
 } else {
  szOutput[j++] = szInput[i];
 }
}
szOutput[j] = '\0';

まぁ、これだと\rの問題が出てくるので、そこら辺...続きを読む

QCGIで改行タグを改行コードに変換ってできますか?

CGIで改行タグを改行コードに変換ってできますか?

$text =~ s/\r\n/<br>/g;
$text =~ s/\r/<br>/g;
$text =~ s/\n/<br>/g;
で確認画面上で表示されるtextareaの文章は改行されるのですが、
届いたメールには<br>と表示されてしまって困ってます。

PHPでは変換できるみたいなのですが、perlでも出来るのでしょうか?

Aベストアンサー

$text =~ s/<br>|<BR>|<Br>|<bR>/\n/;
で戻せます。
が、メール用にオリジナルデータはいじらず
画面表示用に別途「$text」を作って改行コードを変換してはどうでしょうか。
例:
 my $text2 = $text;
$text2 =~ s/\r\n|\r|\n/<br>/g;
として$text2を表示用にした方が良いと思います。

Qテキストエリアにテキストファイルを改行コードごと読み出すには

ただ今勉強中のCGIを使って、テキストファイルの編集・上書き保存をテキストエリアから行いたいのですが、テキストエリアに読み込む時に改行コードが読み込めないためか、最後の一行しか表示できません。どのようにすると、改行コードを含めて編集できるのでしょうか?
その「できないコード(サブルーチン)」は↓になります。

$commentfile = "comment.txt";

■ 読み出し
sub read_commentfile
{
local($masg);
open(IN, $commentfile);
while (<IN>) {$masg = join('',$_);
       $massage = $masg;
}
close(IN);
}

■ コメントの編集画面
sub comment
{
local($html);

&read_commentfile;
#HTML作成
$html = << "EOM";
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=$charset">
<title>コメントの編集</title>
</head>
<body>
<form action="$self" method=post>
<input type=hidden name=mode value="savecomment">
<hr>
コメント<br>
<textarea name=masg cols=40 rows=4>$massage</textarea>
<br>
<input type=submit value=" 更新 ">
</form>
<hr>
</body>
</html>
EOM
&print_html($html);
}

■ 上書き保存
sub savecomment
{
local(@text);
push(@text, "$FORM{'masg'}\n");
open(OUT, ">$commentfile");
print OUT @text;
close(OUT);
}

本来でしたら、ファイルのロック・解除、表ダグ、パスワード等の記述もあるのですが、省いてあります。
よろしくお願い致します。

ただ今勉強中のCGIを使って、テキストファイルの編集・上書き保存をテキストエリアから行いたいのですが、テキストエリアに読み込む時に改行コードが読み込めないためか、最後の一行しか表示できません。どのようにすると、改行コードを含めて編集できるのでしょうか?
その「できないコード(サブルーチン)」は↓になります。

$commentfile = "comment.txt";

■ 読み出し
sub read_commentfile
{
local($masg);
open(IN, $commentfile);
while (<IN>) {$masg = join('',$_);
       $massage ...続きを読む

Aベストアンサー

while (<IN>) {$masg = join('',$_);
       $massage = $masg;
}
そもそもこのループで何をしたい?
と言うか何をしているのかわかっていますか?
それがわかれば自ずとどうすればいいのかわかるはずです。

QCGIを使用してtextareaデータをHTMLファイルに変換の改行。

textareaに入れられたデータをCGIを使用して、HTMLファイルに変換しています。
その時に、改行が1行ずつ多く入ってしまうようなのです。
例えばtextareaに

あああああ

あああ
いいい
ううう

と入っていた場合、できあがったHTMLファイルは

あああああ


あああ

いいい

ううう

となってしまうのです。


できあがったHTMLファイルを見ても改行が多いわけではなさそうなのですが…。

$buffer =~ tr/+/ /;
$buffer =~ s/\n/<BR>/g;
$buffer =~ s/'/\'/g;
$buffer =~ s/・//g;

みたいな感じでなってますが。

おわかりの方よろしくお願いします。

Aベストアンサー

$buffer =~ s/\n/<BR>/g;

$buffer =~ s/\r\n/<BR>/g;
$buffer =~ s/\n/<BR>/g;
$buffer =~ s/\r/<BR>/g;

でどうでしょうか?

Q文字コードも改行コードも変更できなくていいので、

文字コードも改行コードも変更できなくていいので、

すでにサーバーにアップされているテキストファイルを、

ブラウザから編集できるCGIスクリプトを探しています。

削除機能等、余計な物ばかり付いている物しか見当たらないので、

パール言語に詳しい方は、ソースをおしえてください。

よろしくお願いします。

Aベストアンサー

1行目のperlへのパスと編集ファイル、編集ファイルの文字コードの部分を編集、
このCGIも編集ファイルと同じ文字コードで保存する事。



#!/usr/local/bin/perl

$file = 'XXX.txt'; # 編集ファイル
$code = 'UFT-8'; # 編集ファイルの文字コード

read(STDIN, $buff, $ENV{'CONTENT_LENGTH'});
($name, $value) = split(/=/, $buff);
if($name eq 'str') {
open(FILE,"> $file") or die("$file open error");
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/\r\n/\n/g;
$value =~ s/\r/\n/g;
print FILE $value;
close FILE;
} else {
open(FILE, $file) or die("$file open error");
read FILE,$value,-s $file;
close FILE;
}

print <<___HTML;
Content-type: text/html; charset=$code

<body>
<form method="post">
<p><textarea name="str" cols="128" rows="24">$value</textarea></p>
<p><input type="submit" value="更新" /></p>
</form>
</body>
___HTML

1行目のperlへのパスと編集ファイル、編集ファイルの文字コードの部分を編集、
このCGIも編集ファイルと同じ文字コードで保存する事。



#!/usr/local/bin/perl

$file = 'XXX.txt'; # 編集ファイル
$code = 'UFT-8'; # 編集ファイルの文字コード

read(STDIN, $buff, $ENV{'CONTENT_LENGTH'});
($name, $value) = split(/=/, $buff);
if($name eq 'str') {
open(FILE,"> $file") or die("$file open error");
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/\r\n/\n/g;
$value =~ s...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報