SJISの2バイト改行コードを除去するには?

[上に] [前に] [次に]
織田信長 1998/03/10(火) 18:40:41
SJISで書かれたページに<input type=textarea>があります。
そこから複数行のデータを送信します。
CGIがこれを$messageに受け、$message =~ s/\n/<br>/g; を実行した後、ファイルに吐きます。
しかし、当然送信データはSJISなので、改行コードの1バイト目が残ったままになっています。
UNIX上でアクセスしている分には問題ないのですが、このファイルをWinsdowsクライアントに
ダウンロードすると、その1バイトが改行に置き換わってしまいます。
ダウンロードしたときも、一回分の送信データが1行になるようにCGI中で置換するにはどうしたら
よいのでしょうか?

B-Cus 1998/03/10(火) 23:17:57
$message =~ s/\r\n/<br>/g;
でどうですか?

ところで、SJISのページのFORMの改行コードは、ほんとに
\r\n で送られるんでしょうか?

miyasiro 1998/03/11(水) 00:30:21
FORMの改行コードは、RFCの規定によって \r\n になるんじゃないのかなぁ?

miyasiro 1998/03/11(水) 00:58:54
どうもRFCは関係なさそうです。とすると、SJISに合わせて \r\n にしてるってことかな?
いずれにしても、うちの掲示板(SJIS)のTEXTAREAの改行は \r\n で送られてきます。ただし、送信元は、Windows95かMacのみですが。
EUCのページのFORMの改行コードは、\n だけなのでしょうか?

B-Cus 1998/03/11(水) 01:20:15
\r\nで送るのはNNの仕様のようです(EUCのページでも\r\nで送信)。
一方、lynxでは\nでした。ですから
 $message =~ s/\r\n/<br>/g;
 $message =~ s/\n/<br>/g;
が最適解ではないかと思います。

miyasiro 1998/03/11(水) 02:02:09
To: B-Cus さん
すいません。以前からFORMが送る改行の件では悩んでたもので…ありがとうございます。
To: 織田信長 さん
ご質問の件とは直接関係ありませんが、FORMが送る改行の件では、ここの「伝言板に書き込みすると何故か出来る空白行をなくすには?」の回答も参考になると思います。

むらまつ [E-Mail] 1998/03/11(水) 02:37:00
Mac版IE3.01では、\r\n\nというシーケンスで送られる、という話を
どこかCGI関連のサイトで見ました。不確かな情報で申し訳ないですが…。つまり、
$message =~ s/\r\n\n/<br>/g;
ってのもいるかもしれません。

むらまつ [E-Mail] 1998/03/11(水) 02:40:35
あら、ここの話でした。miyasiroさんのメッセージで思い出しました。
灯台超下暗し。
http://www.tohoho-web.com/lng/199802/98022400.htm

#どうりでサーチエンジンで出てこないワケだ

B-Cus 1998/03/11(水) 03:43:02
「伝言板に書き込みすると何故か出来る空白行をなくすには?」
では $message =~ s/\r/<br>/g; というのがあげられていますが、
Macからの送信した場合こうなるんでしょうか? あるいは…?

miyasiro 1998/03/11(水) 04:36:26
あっ、やばい! 上の私の書き込みでは、Mac も \r\n で送ってることになりますね。
以前うちの掲示板で問題になって、URL符号化文字列を保存するルーチンを付け加えたときに、Macでの確認を取る前に、RFC822に従って(準じて)\r\n で送られるという結論になってしまったので、実際には Mac での確認は取ってませんでした。(このときは UNIX の \n の方が問題だったので…)
私も \r の送り主には興味があります。
(ワープロのブラウザの中にも \n を送るものがあるのでは?と疑っているのですが、確認は取れてません)

SHUICHI.T [E-Mail] [HomePage] 1998/03/11(水) 06:00:08
Netscape 3.01 [ja] (Mac) では \r のみが送信されます。
(さっき確認した)

B-Cus 1998/03/11(水) 06:08:59
なるほろ。

$message =~ s/\r\n\n/<br>/g;  # IE3.01+Mac用
$message =~ s/\r\n/<br>/g;   # NN・IE用
$message =~ s/\n/<br>/g;    # Lynx(その他?)用
$message =~ s/\r/<br>/g;    # NN+Mac用

これが完全版ですか。規格はあってもいざ実装するとなると難しいなぁ…。

$message =~ s/[\r\n]+/<br>/g; とどっちが速いかな?

SHUICHI.T [E-Mail] [HomePage] 1998/03/11(水) 06:17:39
>$message =~ s/[\r\n]+/<br>/g; とどっちが速いかな?
それでは同じところで何回改行しても1回しか改行されませんが...

B-Cus 1998/03/11(水) 06:32:19
あはは、そりゃそーだ。失礼しました。
全然関係ないですけど、ところでこの4つのs///、1つのs///で書けます?
さっきやってみたんですけど、あえなく挫折しました(^^;

miyasiro 1998/03/11(水) 14:18:30
$message =~ s/\r\n\n|\r\n|[\r\n]/<br>/g;
ならできますが、| はナシですよね。となるとムリじゃないのかな?
>$message =~ s/[\r\n]+/<br>/g; とどっちが速いかな?
複数改行の件はともかく、文字クラスは、128(256?)バイトのテーブルを使ってるはずだから、こっちの方が速いんじゃないかな?

ところで、Web裏技(www2r.biglobe.ne.jp/~rescue/)のminibbs.cgiは、Ver.7.Xまでは
$message =~ s/\n//g;
として \r を残し、<pre>タグで囲んでブラウザに改行させていたのですが(\n 単独の場合のみ改行できない)、Ver.8になって、この \n に対応したのはいいんだけど、
$message =~ s/\r\n/\r/g;
$message =~ s/\n/\r/g;
のような処理に変わったので(\rは、この後<pre>タグで囲んだり<BR>に変換したりする)、IE3.01+Macの場合に \n が残るので大丈夫かなぁと思ってます。minibbs.cgiでは1メッセージを1行で読むので、\n が残るとまともには書き込めないのではないかと思うのですが…

miyasiro 1998/03/11(水) 14:32:26
またまた、すいません。minibbs.cgi の件は勘違いでした(^^;;;)
上でも、\n はちゃんと \r に変わりますし、オリジナルは、
 if ($value =~ /\r\n/) { $value =~ s/\n//g; }
 elsif ($value =~ /\n/) { $value =~ s/\n/\r/g; }
なので、\n は確実に除去されます。

織田信長 1998/03/11(水) 14:56:39
あっという間にいろいろなご意見ありがとうございました。
JavaScriptと同じでいろいろな仕様の違いがあるのですね。(ーー;
一通りパフォーマンスを検討してみます。
質問の主旨に付いては解決したので、<解決>にさせていただきます。
みなさん、ありがとうございました。

織田信長 1998/03/11(水) 14:57:38
[[解決]]
ごめんなさい、手が滑って「解決」をチェックできなかった・・・

miyasiro 1998/03/11(水) 16:30:19
\r 単独もあるんですね。「伝言板に書き込みすると何故か出来る空白行をなくすには?」では、念のためかな?と思ってました。
ありがとうございます > SHUICHI.T さん

SHUICHI.T [E-Mail] [HomePage] 1998/03/12(木) 06:22:32
ついでに言っておきますが、\r\n は“SJIS の改行”ではなく、“MS-DOS/Windows の改行”です (Mac OS の改行は \r(CR),UNIX の改行は \n(LF))。

miyasiro 1998/03/12(木) 14:04:08
なるほど、おっしゃる通りです。Windows=SJISと思い込んで書いてますね。Windowsに合わせて\r\nにしたってことも考えられないから、訳の分からない文でした。ご指摘ありがとうございます。
う〜ん、この項、特に間違いがおおいなぁ…反省!

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