質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

3回答

3805閲覧

URLのスペースは「%20」か「+」か?

nikuatsu

総合スコア177

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

4グッド

4クリップ

投稿2022/04/19 06:41

編集2022/04/19 07:47

質問

URLに検索パラメータを付与する際に、

https://example.com/search?q=cat%20dog
https://example.com/search?q=cat+dog

という2パターンがあるようでして(他にもある?)、このユースケースを知りたいです。

参考までにTwitterは「%20」でした。
https://twitter.com/search?q=cat%20dog

そしてYahoo! は「+」でした。
https://search.yahoo.co.jp/search?p=cat+dog

どういうときに「%20」を使い、「+」を使うのでしょうか?

尚、今回特に知りたいのは、
➀JavaScriptでpushStateする際にはどちらがいいのか?
②ajaxでPHPへ送る際にはどちらがいいのか?
という点ですが、

もし汎用的にユースケースを整理されている方がいらっしゃればぜひお聞かせください。
宜しくお願い致します。

補足

こんな情報がありました。

クエリストリングには「+」か「%20」、それ以外は「%20」
https://www.suzukikenichi.com/blog/which-shold-you-use-space-20-or-plus-in-urls-containing-space/

ですが、ならばTwitterがなぜ「%20」なのか疑問が残りますので、やや納得感が低いです。

補足2

またはこんなご意見もあります。

ていうかもともとの形にそって、半角スペースは%20に置換してもいいと思う。
https://uragou.hatenablog.com/entry/2018/03/16/144355

私も今回、この 「+」だとデコードができない という問題に躓き質問しました。
(pushStateの件でいえば、pushStateした後にそこからパラメータ(q)の値を取得すると、「+」はデコードできないために正規表現で置換しなければならない)

なので、こちらのご意見に頷くところがございます。

補足3

こちらも「%20」派でした。

x-www-form-urlencodedの仕様的には+の方が正しいのかもしれないが、現実的には%20にした方が安全と思う。
https://qiita.com/aosho235/items/0581fc82f8ce2c5ac055

rumachi, Taste_Bitter, GenbuHase, arcxor👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

経緯

URI, URN, URL という用語があります。最近では WHATWG が URL を再定義してこれらを総称して URL と呼ぶことにしましたが、昔は別々の定義でした。

昔の URL は RFC 1630, 1738 で標準化され、URL とは別の URN が RFC 2141 で規定され、URL と URN を総称したものを RFC 2396, 3986 で URI と呼ぶことになりました。

+ がスペースとなるのは昔の URL において、Query 内に限定して規定されたものです。

Within the query string, the plus sign is reserved as shorthand notation for a space.

HTML フォームにおいては、RFC 1738 に基づいてスペースを + と変換しています。

Control names and values are escaped. Space characters are replaced by `+', and then reserved characters are escaped as described in [RFC1738]

%20 がスペースとなるのは、RFC 3986 で定義されている Percent-Encoding による記法で、対応するASCIIコードが 20(H) であるためです。(こう書くと語弊がありますが、RFC 1738 でもクエリ文字列以外ではスペースを %20 で表現しています)

For example, "%20" is the percent-encoding for the binary octet "00100000" (ABNF: %x20), which in US-ASCII corresponds to the space character (SP).

結論

多くの URL 処理機能を備えるプログラミング言語は RFC 3986 をサポートしています。しかし RFC 1738 に基づくURL処理をサポートしているのは一部です。

例えば PHP では、rawurlencode に対して urlencode が存在します(デコーダもそれぞれ存在します)。

JavaScript では、encodeURIComponent() の他に encodeURI() が、そしてかつて escape() が存在しました。(encodeURI() がスペースを + にするわけではありません。encodeURIComponent() とはエンコードの機能が異なります。)

URLのクエリ文字列をエンコードするにあたっては、RFC 3986 準拠の rawurlencode や encodeURIComponent() を使うのが良いでしょう。つまり、パーセントエンコーディング %20 を積極的に使っておけばよいということです。

フレームワーク等の都合で RFC 1738 に基づくエンコードをせざるを得ない限り、スペースのエンコードに + を積極的に使う理由はないでしょう。

pushStateした後にそこからパラメータ(q)の値を取得すると、「+」はデコードできないために正規表現で置換しなければならない

これは取得の仕方に問題があるのではないでしょうか。以下のようにすれば JavaScript でも + を含むクエリ文字列を適切に扱えます。

js

1const url = new URL(location.href); 2const value = url.searchParams.get('q'); 3console.log(value);

投稿2022/04/19 08:25

arcxor

総合スコア2859

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikuatsu

2022/04/19 09:35

いつも鬼のようにお詳しいですね…。 get('q') 感動しました。「+」でも「%20」でも対応してくれますね。実は今、自前で変換する関数の作成に取り組んでいたところ(しかも別途質問立ててしまいました)が、get('q') があれば万事解決です。これは大変助かりました。 誠にありがとうございます。
guest

0

+が空白になるというのはクエリーストリングでしか使えませんが、それをわかっていれば今時はどっちでも良いでしょう。

違いとしては、CGIプログラムでクエリーストリングを受け取る場合、
1.http://example.com/foo.cgi?aaa+bbb
CGIプログラムは2引数で呼び出され、引数1はaaaで引数2はbbb
2.http://example.com/foo.cgi?aaa%20bbb
CGIプログラムは1引数で呼び出され、引数1はaaa bbb
3.クエリーストリングに生で=が1つでも含まれる場合
CGIプログラムは引数無しで呼び出される。

今時は、=無しのクエリーで、引数で参照するようなCGIプログラムを作る人は居なさそうなので、どっちでも良いかと思います。ライブラリを使うならそのライブラリの仕様に任せれば良いし、自力でエンコーディングするなら、あえて+を使う理由は無いですね。
もしそういうCGIプログラムとウェブページを作るなら、各引数の区切りは+で、1つの引数の中に空白を含める場合は%20という使い分けが必須です。

クエリーストリングで=&が特別な意味を持ったのは、formタグ登場以降なので、それ以前のクエリーストリングを付けるにはisindexタグしか無かった時代には上記の3番のケースは無かったと思います。

投稿2022/04/19 07:22

編集2022/04/19 07:34
otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikuatsu

2022/04/19 09:47 編集

ありがとうございます。お詳しいですね。やはり「+」を使う理由はピンときませんよね。 でも次の関数で「使わざるを得ない状況」になっており、悩んでいます。 // パラメータをセット function setParams( url, param ){ let result = url; const obj = new URL(url); const params = obj.searchParams; Object.keys(param).forEach((k,i)=>{ const v = param[k].replace(/\s+/g, ' '); params.set(k, v); }); return obj.toString(); }
otn

2022/04/19 08:00

「使わざるを得ない状況」と言うことなら使えば良いのでは?何の問題も無いと思いますが?
nikuatsu

2022/04/19 09:47

たしかにですね。うまく使いこなせるよう引き続き調べていきます。ありがとうございました。
guest

0

普通のget送信

HTML

1<form> 2<input name="a" value="1 2"> 3<input type="submit" value="send"> 4</form>

→ a=1+2

formdata処理

javascript

1<script> 2document.addEventListener('formdata',e=>{ 3 e.formData.append("b","3 4"); 4}); 5</script> 6<form> 7<input name="a" value="1 2"> 8<input type="submit" value="send"> 9</form>

→a=1+2&b=3+4

USPでの処理

javascript

1var params=new URLSearchParams(); 2params.append('c','5 6'); 3console.log(params.toString());

c=5+6
どれをとっても普通に「+」ですね。
逆に手動で+にするか%20にするかを判断する必要はないということです

encodeURIComponent

ちなみに手動でURLを作る場合はencodeURIComponentを利用すると思うのでその場合は%20になります

javascript

1console.log(encodeURIComponent('7 8'));

→7%208

投稿2022/04/19 08:38

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2022/04/19 08:44

ちなみにUTF8におけるスペースは「%C2%A0」になりますのでまた違った認識が必要です
nikuatsu

2022/04/19 09:39

ありがとうございます。「%20」に変換するようなメソッドはないのですね。「%20」ならdecodeURIできて便利なのに…と惜しんでいましたが、そういうことであれば諦めて「+」のみ使うように致します。 UTF8の言及についてもどうもありがとうございます。後学のため覚えておきます。
yambejp

2022/04/20 00:10

> そういうことであれば諦めて「+」のみ使うように致します。 いえ、私の回答は「ご自身で+と%20を使い分ける必要はなくAPIに任せる」というものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問