スペース文字をエンコードするURL:+または%20?


723

URLのスペースはいつにエンコードされ+、いつエンコードされ%20ますか?


2
この質問は、いくつかの言語固有の質問として役立つでしょう。
squarecandy 2015年


3
@userあなたがリンクした質問は後で尋ねられたので、これではなく、これは間違いだ
好戦的なチンパンジー2017

回答:


425

ウィキペディアから(強調とリンクを追加):

HTMLフォームに入力されたデータが送信されると、フォームのフィールド名と値がエンコードされ、GETまたはPOSTメソッドを使用してHTTPリクエストメッセージでサーバーに送信されます。デフォルトで使用されるエンコーディングは、改行の正規化やスペースの "%20"ではなく "+"への置換など、多くの変更を加えた一般的なURIパーセントエンコーディングルールの非常に初期のバージョンに基づいています。この方法でエンコードされたMIMEタイプのデータはapplication / x-www-form-urlencodedであり、現在HTMLおよびXForms仕様で(まだ非常に古い方法で)定義されています。

したがって、URLのフォームデータがを使用する変更された形式であるときに、実際のパーセントエンコーディングが使用%20します+。その+ため、クエリ文字列内のURLでのみ表示されます?


2
+エンコーディングは技術的にはmultipart / form-dataエンコーディングですが、パーセントエンコーディングはapplication / x-www-form-urlencodedですか?
BC。

17
@BC:いいえ-MIME multipart/form-dataエンコードを使用します。application/x-www-form-urlencoded用途+と適切にエンコードされたURIが使用します%20
McDowell、

8
「そのため、クエリ文字列の?の後に+のみが表示される可能性が高い」控えめな表現です。URLのパス部分に「+」が表示されないようにしてください。これは、期待どおり(スペース)にならないためです。
アダム・ゲント

34
基本的に:GET http://www.bing.com/search?q=hello+worldhttp://camera.phor.net/cameralife/folders/2012/2012-06%20Pool%20party/
送信の

8
メールリンクの場合、?の後に+を付ける必要はなく、%20を付ける必要があります。たとえば、mailto:support@example.org?subject=I%20need%20help。+でそれを試した場合、電子メールはスペースではなく+ esで開きます。
Sygmoral、2015

288

この混乱は、URLが今でも「壊れている」ためです。

たとえば「http://www.google.com」を例にとります。これはURLです。URLはUniform Resource Locatorであり、実際にはWebページへのポインタです(ほとんどの場合)。実際、URLは1994年の最初の仕様以来、非常に明確に定義された構造を持っています。

http://www.google.com」のURL に関する詳細情報を抽出できます。

+---------------+-------------------+
|      Part     |      Data         |
+---------------+-------------------+
|  Scheme       | http              |
|  Host         | www.google.com    |
+---------------+-------------------+

次のようなより複雑なURLを見ると、

" https:// bob:bobby@www.lunatech.com:8080 / file; p = 1?q = 2#third "

次の情報を抽出できます。

+-------------------+---------------------+
|        Part       |       Data          |
+-------------------+---------------------+
|  Scheme           | https               |
|  User             | bob                 |
|  Password         | bobby               |
|  Host             | www.lunatech.com    |
|  Port             | 8080                |
|  Path             | /file;p=1           |
|  Path parameter   | p=1                 |
|  Query            | q=2                 |
|  Fragment         | third               |
+-------------------+---------------------+

https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third
\___/   \_/ \___/ \______________/ \__/\_______/ \_/ \___/
  |      |    |          |          |      | \_/  |    |
Scheme User Password    Host       Port  Path |   | Fragment
        \_____________________________/       | Query
                       |               Path parameter
                   Authority

予約文字はパーツごとに異なります。

HTTP URLの場合、パスフラグメントパーツのスペースは「%20」にエンコードする必要があります(絶対に「+」ではない)。一方、パスフラグメントパーツの「+」文字はエンコードしないでおくことができます。

クエリ部分では、スペースは「+」(後方互換性のために:URI標準で検索しないでください)または「%20」のいずれかにエンコードできますが、「+」文字(このあいまいさの結果として) ) "%2B"にエスケープする必要があります。

つまり、「青+水色」の文字列は、パス部分とクエリ部分で別々にエンコードする必要があります。

http://example.com/blue+light%20blue?blue%2Blight+blue」。

そこから、完全に構築されたURLをエンコードすることは、URL構造の構文上の認識がなければ不可能であると推測できます。

これは要約すると:

あなたは%20前後に持っている必要が?あり+ます。

ソース


>>の前に%20があるはずです?+愚かな質問でごめんなさい。ハッシュタグパラメータが「?」の後に使用されていることが少しわかります 疑問符パラメーター。"#"を使用してもページが再読み込みされないため、多少異なりますが。しかし、「#」ハッシュタグの後に%20と+記号を使用しようとしていますが、機能しないようです。「#」の後にどちらを使用する必要がありますか?
Philcyb 2015


クエリ部分には実際に「公式」の標準がありますか?基本的にその部分はアプリケーション固有だと思いました。99.99%のアプリはkey1=value1&key1=value2、キーと値がencodeURIComponent次のルールに従ってエンコードされる場所で使用しますが、クエリ部分のコンテンツはアプリまで完全に100%です。それ以外の場合は、最初#に行くだけで、公式のエンコーディングはありません。
gman

重複した質問に対する重複した回答!しかし、うーん、そう、私は両方にUPを与えました。
Vladimir Vukanac

3
そのASCIIコンポーネントのラベル付けは壮大です。
jsejcksn

25

お勧めし%20ます。

それらをハードコーディングしていますか?

ただし、これは言語間であまり一貫していません。誤解しない限り、PHP urlencode()ではスペースをとして扱い+、Python ではスペースをとしてurlencode()扱います%20

編集:

誤解しているようです。Python urlencode()(少なくとも2.7.2では)のquote_plus()代わりにquote()を使用し、スペースを "+"としてエンコードします。W3Cの推奨事項は、http//www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1のように "+"でもあるようです

そして実際には、スペースのエンコードに何を使用するかについて、Python独自の課題追跡システムに関するこの興味深い議論をフォローできます:http : //bugs.python.org/issue13866

編集#2:

""をエンコードする最も一般的な方法は "+"であると理解していますが、ただのメモです。

import urllib
print(urllib.urlencode({' ' : '+ '})

>>> '+=%2B+'

ハードコーディングしない。審美的な観点から、スペースを含む私のURLがどのようになるかを判断しようとしています。
BC。

こんにちは、私も混乱しています。ユーザーがHTMLフォームを送信すると、フォームはどのようにスペースをエンコードしますか?どのキャラクターと?結果はブラウザに依存していますか?
GMsoF

1
そして、URLEncoder.encode()Java のメソッド+もそれを変換します。
рüффп

次に、POSTリクエストの本文でエンコードを処理する方法についての質問が発生します。「Content-Type:application / x-www-form-urlencoded」ここで、パラメーターは「a = b&c = d」の形式です、ただし、URLには含まれず、「ドキュメント」の本文のみが含まれます。彼らはこの問題を本当に混乱させ、決定的な答えを見つけるのは非常に困難です。
fyngyrz 14

Perlのuri_escape()は、それらを%20として扱います
ユーザー、

16

スペースは、「application / x-www-form-urlencoded」コンテンツタイプのキーと値のペアのクエリ部分でのみ「+」にエンコードできます。私の意見では、これはMAYであり、MUSTではありません。残りのURLでは、%20としてエンコードされます。

私の意見では、URLのクエリ部分であっても、常に「+」ではなく%20としてスペースをエンコードする方が良いです。これは、スペース文字を「」としてエンコードするように指定したのがHTML仕様(RFC-1866)だからです「」/「application / x-www-form-urlencoded」コンテンツタイプのKey-Valueペア(8.2.1項、サブパラグラフ1を参照)

このフォームデータのエンコード方法は、後のHTML仕様でも規定されています。たとえば、HTML 4.01仕様などでapplication / x-www-form-urlencodedに関する関連する段落を探します。

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

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

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

実装は、選択したプログラミング言語によって異なります。

URLに国別文字が含まれている場合は、まずそれらをUTF-8にエンコードしてから、結果をパーセントエンコードします。


1
リクエストされたリソースがHTMLでない場合、なぜHTML仕様を気にする必要があるのですか?HTMLで応答しない一部のWeb APIで「+」を見たことがあります。たとえば、pdfを要求します。「%20」を使用しないのは間違っていると思います。
の驚異的な1

@TheincredibleJan、私はあなたに同意します。それが私の返事です。
Maxim Masiutin 2018

1
@MaximMasiutin「これはMAYであり、MUSTではない」という答えが出た場合、どの仕様を参照していますか?私はそれを持っているスペックを見つけるのに苦労しています。w3.org/TR/1999/REC-html401-19991224/interact/...(クエリセクションに)「+」を使用してスペックの「必須」セクション内にあります。
JosephH

2
@JosephH-ご連絡ありがとうございます。5月についての私の見解です。投稿を編集しました。私が言ったことは、あなたがqoutしたHTML仕様が "+"を定義しているということですが、URLコンテキストでは、%20としてエンコードスペースを許可する他のルールが適用されます。
Maxim Masiutin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.