改行に正しく扱うには?

[上に] [前に] [次に]
まる [E-Mail] 1999/03/12(金) 14:32:42
\n(改行)と\rの違いを教えてください。

テキストやテキストエリアなどに入力されたデータを、
解析して、CSVファイルに出力したり、入力データをメール送信する
CGIをいくつか作ったのですが、いつも改行の処理で悩んでしまいます。

ちなみにサーバOSはLinuxで、改行はLFです。そのサーバにWindowsで
作成したファイルをアップロードしています。この時当然改行は、CRからLFに変換はしています。

テキストエリアに改行を含むデータを入力された時の処理に困っています。同じフォーム解析用の関数を利用して改行を削除したりしています。 $value =~ s/\n//g; という具合に改行を削除しています。
これだと、あるHTMLファイルから呼び出した時は改行が削除されるの
ですが、べつのHTMLファイルから呼び出した時は改行が削除されなかったりする場合があります。この時、\nを\rに変えて実行してみると、改行を削除する場合があります。
\nと\rの違いはいったいどこにあるのでしょうか、教えてください。

また、同一文をメール送信する場合、メーラによってメール本文改行の扱いが違うことがあります。
OutlookやNetScapeを使用した場合と、ユードラを使用した場合、ユードラを使用したほうが改行が余分についてしまいます。
現状では、Outlookの1行の改行が、ユードラでは2行の改行になって
しまいます。

改行の扱い方にはいつも苦労させられています。
少し、文が説明不足で読みにくい面もあると思いますが、
どなたか改行の扱い方やメタ文字の\nと\rの違いを教えてください。
お願いします。

moci [E-Mail] 1999/03/12(金) 15:20:32
まず改行コードですが、Windows系では「CR」だけではなく、
「CR」+「LF」となっています。「CR」だけなのはMacだそうで。
さらにこの「CR」が「\r」であり、コードは0x0D(13)、
「LF」が「\n」でコードが0x0A(10)となっています。
ちなみに「CR」は「キャリッジ・リターン」、「LF」は
「ライン・フィード」で、それぞれ「復帰」「改行」です。

# 「キャリッジ・リターン」「ライン・フィード」というのは、
# タイプライターの動作を考えてもらえると良いのではないかと。
# ヘッドが左右に動く形式のプリンタでもいいですね。

改行削除の処理ですが、「$value =~ s/\n//g;」では
「\r」が残ってしまうのではないでしょうか。

改行数の違いについてはどちらのメーラも使ったことが
ないのですが、たとえば「\n」をわざわざ「\r\n」に
変換してくれるWindows上のソフトがあります。

ex.Netscape Navigatorで「名前を付けて保存」

この場合、保存するページがMicrosoft IISのような
Windows上のサーバにあり、改行コードが「\r\n」と
なっていても、その「\n」の部分だけを「\r\n」に変換、
結果として「\r\r\n」となってしまい、最初の「\r」と
次の「\r\n」とで2つの改行とみなすソフトもあります。
あるいは同じことが原因なのかもしれませんね。

[上に] [前に] [次に]