現在、フォームからのデータ入力などに関して勉強しているのですが、<textarea>からデータを入力すると、1バイトの改行文字が、改行ごとにくっついてきます。
 改行自体はされるんですが、その余計なものが付いてくるのが困っています。何かしらのスクリプトをダウンロードしたときなども、時々改行部分が半角の■に変わってまして、つまり改行されずにごっちゃになって表示されてしまいます(別の方法で置換処理できるので自分はどーでもいいんですが)。
 他のパソコンから同じCGIをアップロード、実行してみると、以外にもそういった影響はありませんでした。何となく、文字コードが機種とか環境などによって違ってるせいかな、とは感じているのですが、対処法が分かりません。
 スクリプトにどういった手を加えれば、これが出ないようにできるのでしょうか?どうかご教授をお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

UNIX上に改行コードLFで置いていて、Windows系のOSにFTPするときに


ASCIIモードで転送すれば改行コードはLF->CR+LFに変換されます。
逆向きも同様です。

Perlで置換したいならファイルをオープンした後binmodeを指定すれば
CR:\r
LF:\n
で置換出来ます。
s/\n/\r\n/

binmodeを指定しないと、\n自体がプラットフォームに合せて勝手に判
断してしまうため、この手の置換は出来ません。

こんな感じで如何でしょうか?
    • good
    • 0
この回答へのお礼

 回答ありがとうございます。仰るとおりにしてみたら、見事にできるようになりました。just like magicです(笑)。

 UNIXではCRが余計なせいでゴミが出ていたわけですから、CRを削除してみたらうまくできました。つまり自分がやりたいと思ったときには、既にwindows上CR+LF→UNIX上LFとなっていたんですね。それでUNIX上でのCRが邪魔でゴミが残っていた、という状況だったようです。

 とても助かりました。本当にありがとう御座いました。またなにかありましたら、その時はまた、ご教授をお願いします。

お礼日時:2001/04/21 23:48

スクリプトに於いて。


データを読み込み,希望の形式に変換してから保存する。
これだけでは?
    • good
    • 0

改行コードが違うからですね。



通常Windowsでは改行がCR+LFとなっていて
UNIXではLFのみです。従って、改行するたびに
CRというごみが入るのです。

そこら辺は置換作業で何とかなりますよ。
#ついでに、CGIをやるなら「メモ帳」はやめて
#WZEditorなどの改行コード、文字コードを
#指定できるものにしましょう。
ではでは☆

この回答への補足

 改行文字が入ったデータファイルが作成される場合、それはUNIXサーバ上でできるものだから問題ない(ゴミが入らない)としても、それをwindowsでダウンロードしようとすると、改行コードのCRが足らないせいで改行されずまとまってしまい、改行部分に半角の■ができてしまうのですね。
 それの逆をする、つまりwindows上で改行したデータファイルをアップすると、CR部である半角■と改行になってしまう、ということでよろしいのでしょうか?

 そのため、それを完全に回避する場合にはUNIXと同じ環境、つまりwindows上でも改行文字をLFのみで指定できるテキストエディタが必要なわけですね(どこかで理解のし間違いがあったら訂正をお願いします)。
 でも・・・WZEditorって、高過ぎなんですけど・・・。他にいい方法はありませんか?

 置換で何とかなると仰いましたが、置換でLFをCR+LFにするようなことができるんでしょうか?可能でしたら、是非その方法を教えて下さい(そういうのって本にのってませんね)。
 よろしくお願いします。

補足日時:2001/04/21 05:16
    • good
    • 0

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

この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の問題が出てくるので、そこら辺...続きを読む

QTEXTAREAの改行がうまくいきません。

自作で掲示版を作成している、初心者です。現在作成中の掲示版にTEXTAREAに入力し、LOG上では1行目<BR>2行目といった形で改行をBRに置き換えて保存していますが、その修正としてLOGからデータをとり改行状態で表示させたいのですが、
うまく改行されない状態です。下記にLOGより読み込み。タグを\rに置き換えて
いますが、TEXTAREAに表示されなく、改行表示どころではありません。
いったいどうすればよいのでしょうか?ご教示をお願いします。

<CGI文>
$wkaaa1 = $IXUSERINF{Enaiyo}; データを取得
$wkaaa =~ &notag1($wkaaa1);  変換(これがおかしい?)
$mesbuff .= "<TR><TD nowrap ><TEXTAREA ROW=\"10\" COLS=\"48\" NAME=\"Enaiyo\" WRAP=\"soft\">$wkaaa </TEXTAREA></TD></TR>";

<sub>
sub notag1 {
local($_) = @_;
s/&/&amp;/g;
s/"/&quot;/g;
s/</&lt;/g;
s/>/&gt;/g;
s/&lt;br&gt;/\n/gi (これで <BR>を\n(改行)にしてるつもり
return $_;
}

自作で掲示版を作成している、初心者です。現在作成中の掲示版にTEXTAREAに入力し、LOG上では1行目<BR>2行目といった形で改行をBRに置き換えて保存していますが、その修正としてLOGからデータをとり改行状態で表示させたいのですが、
うまく改行されない状態です。下記にLOGより読み込み。タグを\rに置き換えて
いますが、TEXTAREAに表示されなく、改行表示どころではありません。
いったいどうすればよいのでしょうか?ご教示をお願いします。

<CGI文>
$wkaaa1 = $IXUSERINF{Enaiyo}; データを取得
$...続きを読む

Aベストアンサー

>上記のパターンをそれぞれ入れてみてやってみましたが、
これで上手くいくと思っていたのに残念ですね....
試験的に、改行でない文字に置換できるか確認してみてはどうでしょう。
# $WEnaiyo =~ s/<BR>/HENKAN/g;
# のような感じで。

これでダメなら、改行文字ではなく「置換」そのものに不具合があると考えられます。
ログデータの最後の項目に変化を施すようなので、
これだけで試してみてはどうでしょうか。
# 未テストなのでscript確認してください(汗

open(FH,"$logfile") or die "$!";
foreach(<FH>){
my @line = split(/,/,$_,);
$line[$#line] =~ s/<BR>/HENKAN/g;
print "$line[$#line]\n";
}
close(FH);

QTEXTAREAで改行するとついてくるゴミコード

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

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

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

Aベストアンサー

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

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

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

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

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;

でどうでしょうか?

Qtextareaで改行すると、修正時、書き込んだデータがなくなります。

CGIのカスタマイズに関する質問です。
ソードワールドRPGキャラクターシート管理CGIを使用しています。
初期の設定で<input type>と<textarea>の改行をする際は<br>を使うと言う形になっています。
その中で<textarea>の改行をエンターキーでしたいと思い、
sub htmlunquote{
my $text = shift;
$$text =~ s/&lt;/</g;$$text =~ s/&gt;/>/g;
の部分を
sub htmlunquote{
    my $text = shift;
$$text1 =~ s/\r\n/<br>/g;
$$text1 =~ s/\r/<br>/g;
$$text1 =~ s/\n/<br>/g;
と変換してみました。
すると、エンターキーで改行できるようになったのですが、修正や追記しようとすると、何故か前に書き込んだ文章が消えてしまっています。

なぜ、文章が消えてしまうのか、全く検討がつきません。FFFTPから、データを覗くと、書き込まれたデータはあるのですが……。
それとも改行をさせる方法が根本的に間違っているのでしょうか。
ご教授お願いいたします。

CGIのカスタマイズに関する質問です。
ソードワールドRPGキャラクターシート管理CGIを使用しています。
初期の設定で<input type>と<textarea>の改行をする際は<br>を使うと言う形になっています。
その中で<textarea>の改行をエンターキーでしたいと思い、
sub htmlunquote{
my $text = shift;
$$text =~ s/&lt;/</g;$$text =~ s/&gt;/>/g;
の部分を
sub htmlunquote{
    my $text = shift;
$$text1 =~ s/\r\n/<br>/g;
$$text1 =~ s/\r/<br>/g;
$$text1 =~ s/\n/<br>/g...続きを読む

Aベストアンサー

ソースを見てみました。
キャラクタ更新フォームのデータを読むところで、
$_ =~ s/<(.*?)>([^<]+)<\/.*?>/$pc{"$1"} = $2;/egi while <IN>;
と、しているためデータ内に<br>が入っているとその項目が読み込み出来ません


下記の様に変更してみてください

sub htmlunquote{
my $text = shift;
$$text =~ s/&lt;/</g;$$text =~ s/&gt;/>/g;
$$text =~ s/\n/<br>/g;
}
sub htmlquote{
my $text = shift;
$$text =~ s/&/&amp;/g;$$text =~ s/"/&quot;'/g;
$$text =~ s/</&lt;/g;$$text =~ s/>/&gt;/g;
}
表示時は<br>に変換、記録時は改行をそのまま残します。

キャラクタ更新フォームのデータを読む箇所は
改行が入っているとwhile <IN>が分割されてしまうため下記のように変更
open(IN, "$chardatadir${file}.cgi") or error('システムエラー',"キャラクターファイル($file)が開けません。");
$_=join("",<IN>);
$_ =~ s/<(.*?)>([^<]+)<\/.*?>/$pc{"$1"} = $2;/egi;
close(IN);

これでOKになるはず

ソースを見てみました。
キャラクタ更新フォームのデータを読むところで、
$_ =~ s/<(.*?)>([^<]+)<\/.*?>/$pc{"$1"} = $2;/egi while <IN>;
と、しているためデータ内に<br>が入っているとその項目が読み込み出来ません


下記の様に変更してみてください

sub htmlunquote{
my $text = shift;
$$text =~ s/&lt;/</g;$$text =~ s/&gt;/>/g;
$$text =~ s/\n/<br>/g;
}
sub htmlquote{
my $text = shift;
$$text =~ s/&/&amp;/g;$$text =~ s/"/&quot;'/g;
$$text =~ s/</&lt;/g;$$text =~ s/>/&gt;...続きを読む


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

おすすめ情報