スペースをプラス(+)または%20にエンコードするタイミング


回答:


481

+URLのクエリ部分など、コンテンツ内のみのスペースを意味しapplication/x-www-form-urlencodedます。

http://www.example.com/path/foo+bar/path?query+name=query+value

このURLでは、パラメーター名にはquery nameスペースが含まれ、値にはquery valueスペースが含まれていますが、パス内のフォルダー名はfoo+barなく、 foo barです。

%20これらのコンテキストのいずれかでスペースをエンコードする有効な方法です。したがって、URLの一部に含めるために文字列をURLエンコードする必要がある場合は、スペースを%20プラスに、プラスをプラスに置き換えても常に安全%2Bです。これは例です。encodeURIComponent()JavaScriptで行います。残念ながら、それはurlencodeがPHPで行うことではありません(rawurlencodeの方が安全です)。

関連項目 HTML 4.01仕様application / x-www-form-urlencoded


5
本当に私は混乱しています、私の質問は、ブラウザが最初のフォームをいつ実行し、いつ2番目のフォームを実行するのですか?
Muhammad Hewedy 2010

11
ブラウザはをquery+name=query+value使用してフォームからパラメータを作成します<input name="query name" value="query value">query%20nameフォームからは作成されませんが、代わりにそれを使用することは完全に安全です。自分でフォーム送信をまとめる場合XMLHttpRequest。のようにスペースが含まれているURLがある場合<a href="http://www.example.com/foo bar/">、ブラウザーはそれをエンコードし%20て間違いを修正しますが、これはおそらく信頼されません。
ボビンス2010

6
JavaScriptのメイクに何の機能foo barfoo+bar
Sisir 2012年

21
@Sisir:URLフォームのエンコーディングを行うJS関数はありません。encodeURIComponent(s).replace(/%20/g, '+')本当に必要な場合は当然行うことができます+
ボビンス2012年

2
これは、form-urlencodeされたものの非常に紛らわしい例です。URLとは関係ありません。
Dave Van den Eynde 2014年

54

http://www.example.com/some/path/to/resource?param1=value1

疑問符の前の部分は%エンコーディングを使用する必要があるため(%20スペースの場合)、疑問符の後にはスペース%20または+スペースのいずれかを使用できます。+疑問符の後に実際が必要な場合は、を使用してください%2B


6
@DaveVandenEyndeどうして?
cerberos 2014年

10
それは間違っているからです。これは、URLに適用されない古いapplication / x-www-form-urlencodedメディアタイプの一部です。また、decodeURIComponentデコードしません。
Dave Van den Eynde 2014年

3
ええ、それはおそらくRFC 1630からコピーされたもので、実際には標準ではありませんでした。tools.ietf.org/html/rfc3986が標準です(IPv6などで再度更新されます)。確かにブラウザはそれを「サポート」していますが、それはどういう意味ですか?ブラウザではなく、クエリ文字列を読み取ってデコードするのはサーバーコードまたはクライアントコードです。ブラウザは単にそれをやり取りするだけであり、+予約文字であるため、ブラウザによって保持されます。
Dave Van den Eynde 2014年

18
Googleでは、検索URLのスペースに+を使用しています(google.com/#q=perl+equivalent+to+php+urlencode+spaces+as+%2B)。
ジャスティン

2
参考までに:Railsも+デフォルトでスペースをデコードします({ foo: 'bar bar'}.to_query=> foo=bar+bar
wrtsprt 2015年

46

だから、ここでの答えはすべて少し不完全です。URLのスペースをエンコードするための '%20'の使用は、URIの構築方法を定義するRFC3986で明示的に定義されています。この仕様では、スペースのエンコードに「+」を使用することについての言及はありません。この仕様のみで行く場合、スペースは「%20」としてエンコードする必要があります。

スペースのエンコードに「+」を使用することについての言及は、HTML仕様のさまざまな具体化、特にコンテンツタイプ「application / x-www-form-urlencoded」を説明するセクションから来ています。これはフォームデータの投稿に使用されます。

現在、HTML 2.0仕様(RFC1866)は、セクション8.2.2で、GETリクエストのURL文字列のクエリ部分を「application / x-www-form-urlencoded」としてエンコードする必要があることを明確に述べています。理論的には、これはクエリ文字列のURLで「+」を使用することが合法であることを示唆しています(「?」の後)。

しかし...それは本当にですか?HTMLはそれ自体がコンテンツ仕様であり、クエリ文字列を含むURLはHTML以外のコンテンツでも使用できます。さらに、HTML仕様の新しいバージョンでは、「+」を「application / x-www-form-urlencoded」コンテンツで合法として定義し続けていますが、GETリクエストのクエリ文字列がそのタイプとして定義されているという部分は完全に省略されています。実際、HTML 2.0仕様以降のクエリ文字列のエンコーディングについては何も触れられていません。

どちらが私たちに質問を残します-それは有効ですか?確かに、クエリ文字列で「+」をサポートする多くのレガシーコードと、それを生成する多くのコードがあります。したがって、オッズは「+」を使用しても壊れることはありません。(そして、実際、私は最近、GETクエリで '%20'をスペースとして受け入れられない主要なサイトを発見したため、これに関するすべての調査を行いました。実際には、パーセントエンコードされた文字のデコードに失敗しました。サービス使用していることも関連する場合があります。)

しかし、仕様を純粋に読むだけで、HTML 2.0仕様の言語が後のバージョンに引き継がれることなく、URLは完全にRFC3986でカバーされます。つまり、スペースは '%20'に変換する必要があります。そして、HTMLドキュメント以外のものをリクエストする場合は、間違いなくそうです。


回答に追加するために、ChromeはデフォルトでURLのスペースを%20<a href="?q=a b">)としてエンコードしますが、フォームを送信するときは、+記号を使用します。明示的に+記号(<a href="?q=a+b">)を使用するか、を使用してフォームを送信することで、これをオーバーライドできますXMLHTTPRequest
x-yuri

URLSearchParams developers.google.com/web/updates/2016/01/urlsearchparamsを追加する目的を理解するのは本当に難しいです。これは従来の方法で機能します(スペースを「+」にシリアル化)。IE11でもサポートされていません。
ニンフェタミン

9

スペースを常に「+」ではなく%20としてエンコードすることをお勧めします。

これはRFC-1866(HTML 2.0仕様)で、「application / x-www-form-urlencoded」コンテンツタイプのキーと値のペアでスペース文字を「+」としてエンコードする必要があることを指定していました。(パラグラフ8.2.1を参照。サブパラグラフ1)。このフォームデータのエンコード方法は、後のHTML仕様にも記載されています。application/ x-www-form-urlencodedに関する関連する段落を探してください。

RFC-1866がスペースをプラスとしてエンコードできるURLのそのような文字列の例は次のとおりです: "http://example.com/over/there?name=foo+bar"。したがって、RFC-1866によれば、「?」の後にのみ、スペースをプラス記号で置き換えることができます。その他の場合、スペースは%20にエンコードする必要があります。ただし、コンテキストを判別するのは難しいため、スペースを「+」としてエンコードしないことがベストプラクティスです。

RFC-3986、p.2.3で定義されている「予約されていない」以外のすべての文字をパーセントエンコードすることをお勧めします。

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"

1
.Net FrameworkではUrlEncodeはQueryStringで '+'を使用しますが、最新の.Net Coreでは%20を使用します
Michael Freidgeim

@ MiFreidgeimSO-stopbeingevilお知らせいただきありがとうございます。最近の.Net Coreはより一貫性があり、互換性があることに決めたようです。
Maxim Masiutin

2

違いは何ですか:他の回答を参照してください。

+代わりに使用する場合%20+何らかの理由で、URLクエリ文字列(?.....)またはハッシュフラグメント(#....)を読みやすくする場合に使用します。例:実際にこれを読むことができます:

https://www.google.se/#q=google+doesn%27t+encode+:+and+uses+%2B+instead+of+spaces%2B= +)

しかし、以下は読みにくいです:(少なくとも私にとって)

https://www.google.se/#q=google%20doesn%27t%20oops%20:%20%20this%20text%20%2B%20is%20different%20spaces

+Googleが使用しており+(上記の最初のリンクを参照)、おそらくこれについて考えているため、何も壊すことはないと思います。+可読性+ Googleが大丈夫だと思っているからといって、自分を使用します。


7
「読みやすさ」の議論は「+」の最善の防御策だと私は言います。「グーグルはそれをする」という議論は
誤りである

2
@FlipMcF誤った論拠からのウィキペディアのページは、「当局が専門分野外のトピックについて引用されている場合、または引用されている当局が真の専門家でない場合」についてです。ただし、コンピューター、HTTP、およびURLエンコーディングは、Googleの専門分野の範囲内のものです。
KajMagnus 2017年

3
@FlipMcF Googleの動作を引用することは、この場合、URLで「+」を使用する有効な引数です。グーグルが権威であるとは限らないが、グーグルはおそらく最大のインターネット企業であり、彼らが何らかの方法で何かをしたとしても、ブラウザがいつかその慣行のサポートを中止することを決定する可能性は非常に低い。また、google chromeはシェアが最も高いブラウザの1つであり、googleが望むすべてをサポートします。結局のところ、「%20」の代わりに「+」を使用する人は、近い将来にそのために苦労することはないと思います。
jdferreira 2017年

権威への訴えを認めることを拒否する人気への訴えがある他の場所でこの議論を続けたいと思います。少なくとも1つのことに同意できます。「+」は「%20」より優れています
FlipMcF

1
実際、%20を含むURLは、マウスカーソルをリンク上に移動すると(デスクトップ)ブラウザーがデコードされたURLをウィンドウの下部に表示するため、はるかに読みやすくなります。プラス記号は変更されずに表示されます。
マーティン、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.