2009-06-02 2 views
2

誰かがこのブラウザの動作にいくつかの光を当てることができれば、私は思っていた提出します。(jQueryのを使用して、私は、サーバーのいずれかXHR経由に提出されたテキストエリアのフォームを持っている改行文字が異なっ

を、私は」また、単純なXMLHttpRequestを使用してjQueryをルール化してみましたが、結果は同じです)またはフォームの送信による「旧式」の方法。どちらの場合も、method = "POST"が使用されます。 両方の方法で、サーバー上の同じスクリプトに送信されます。

XHRで送信した場合、新しい行の文字は "%0A"(または間違っていないと\ n)として転送され、通常の方法で送信すると "%0D% 0A "(または\ r \ n)。 これはもちろん、サーバー側でいくつかの問題を引き起こしますが、ここでは問題にはなりません。 なぜこの違いがあるのか​​知りたいですか?どのような方法で送信しても、新しい行は同じに転送されるべきではありませんか?他にどのような違いがあるのでしょうか?

答えて

2

XMLHttpRequestはXMLストリームを送信するときにストリームからCR文字を取り除きます。これは、CRLFが単純なLFに正規化されることを示すXML仕様と一致しています。

コンテンツをXMLとしてパッケージ化してXHR経由で送信すると、CRが失われます。

+0

私はXMLを送信していません。テキストエリアから直接プレーンテキストだけを送信します。 –

+0

+1、XHR仕様が良い答えです。 – CookieOfFortune

+0

@ヤン:しかし、あなたはXHRを使用していますか?どのブラウザを使用していますか?いくつかのコードを表示できますか?すべての可能性について、このCRLFからLFへの正規化は、そうであってはならない場合でもあなたを引き上げます。 – AnthonyWJones

2

RFC2616(HTTP1.1)の3.7.1部分では、\ r \ n、\ r、\ nのいずれかで改行を表すことができます。

HTTPは、この要件を緩和し、単独でそれが全体エンティティボディのために一貫して行われるライン ブレークを表す普通CRまたはLFのテキストメディアの 輸送を可能にします。 HTTP アプリケーションは、HTTP経由で受信したテキストメディアの改行を表す として、CRLF、裸のCR、および裸のLFを受け入れなければなりません。

しかし、これは構造を制御するためには適用されません。

改行に関するこの柔軟性はエンティティボディにのみテキストメディアに適用されます。 HTTPコントロール 構造(ヘッダーフィールドやマルチパート境界など)のいずれかで、裸のCR またはLFをCRLFの代わりに使用してはならない(MUST NOT)。

+0

私はそれを理解しています。問題はなぜ同じブラウザの違いですか? –

+0

おそらく実装の違いは、おそらく彼らはどこか他の場所からXHRコードを受け取りましたか? – CookieOfFortune

+0

@CookieOfFprtune:あなたはHTTP仕様のこのセクションを誤解していると思います。仕様では、エンティティボディのPOSTがCRLFシーケンスをLFシーケンスに置き換えるという提案はありません。 HTTPヘッダーの中では、ヘッダー行が厳密にCRLFで終了しているのに対して、テキスト本文の行は、LFまたはCRまたはCRLFだけを含んでいる可能性があります。 – AnthonyWJones