たびたびすみません、荻野です。またひとつ分からない点が。

  ruby 1.4.3 (1999-12-08) [i386-cygwin]
  Apache/1.3.9 (Win32)
  Windows2000RC2 + cygwin1-20000211.dll
  InternetExplorer 5

の組み合わせで、1.4.3付属の CGI.rb Version 1.00 を使用するとき、改行を
含む値を受け取って表示すると2重に改行されてしまいます。が、どこの問題
でどこで対処するべきなのかが良く分かりません。またこれは私の環境に限っ
た話なのでしょうか。

どうも改行コードとして \r\n を受け取るとそれがそのまま渡されて、それを
出力すると InternetExplorer 上で2つの改行として扱われるようなのですが、
これは Win32 上で扱う可能性のあるときには gsub(/\r\n/,"\n") をするべき
ということなのでしょうか。

ちょっと混乱しているのですが、

1) Cygwin版の Ruby は C などのように \n を改行のマクロとして扱い、出力
時には CR,LF として出力するのでしょうか。または Cygwin が変換している
のでしょうか?

2) HTTP は行の区切りは CR, LF と決まっていたと思うのですが、CGI にもそ
のような規定があるのでしょうか。つまり UNIX 版などでも CGI を作成する
とき、print "hoge\n" ではなく print "hoge\r\n" を使用するべきなのでしょ
うか。それとも Apache とか IIS とかの WWWサーバに依存するのでしょうか。
(少なくとも Macintosh の CGI の改行は CR のみだったように思うのですが)

あたりも分かっていませんので、あわせてお教えいただければ幸いです。


...いろいろ試してみるうちに完全に混乱してきました。

3) cgi.params['TEST'][0].gsub(/\r\n/,"\n") … 効果なし
4) cgi.params['TEST'][0].gsub(/\r\r\n/,"\n") … 正常に改行
5) cgi.params['TEST'][0].gsub(/\r/,"[CR]") … [CR]がひとつ
6) cgi.params['TEST'][0].gsub(/\r\r/,"[CR]") … 置換が起きず
7) cgi.params['TEST'][0].gsub(/\r\r\n/,"[CR]") … [CR]がひとつ

特に 6) が置換できないで 7) が置換できるあたりとか、7)が置換できるのに
5) で置換が一回しかおきないあたりとか。ここらは Apache とかは無関係で
すよね。


(たとえば TEXTAREA などの値、IE5 で)
test.cgi?TEST=VALUE%0D%0Anew-line

----- IE 上の表示 -----
TEST=VALUE

new-line
----- ここまで -----

----- test.cgi -----
#!ruby
require 'cgi'
cgi = CGI.new
print <<EOT
Content-Type: text/html

<TITLE>CGI TEST</TITLE>
<PRE>
TEST=#{cgi.params['TEST'][0]}
</PRE>
EOT
----- test.cgi -----

すみませんが、よろしくお願いいたします。

-- 
荻野 充 (おぎの みつる) ... 「萩(はぎ)」にあらず
名古屋大学消費生活協同組合