DevToolBox

URL Encode Space (%20) - スペースのURLエンコード完全ガイド

最終更新日: 2026-07-12公開日: 2026-07-12執筆: DevToolBox編集部

URLにファイル名やユーザー入力をそのまま埋め込んだら、スペースのところでリンクが切れた ――よくあるトラブルです。url encode space(スペースのURLエンコード)は%20 という表記に置き換えるだけですが、クエリ文字列の + との 使い分けや encodeURIComponentencodeURI の違いなど、 混同しやすいポイントが複数あります。この記事ではその仕組みと正しい実装方法を整理します。

Raw spaces are not valid in a URL, so they must be percent-encoded as %20. This guide covers why, when +is a valid alternative (and when it isn't), the difference between encodeURIComponent and encodeURI, and how to avoid the double-encoding bug that turns %20 into %2520.

TL;DR

URL Encoder / Decoder

テキストやURLをパーセントエンコード・デコード。日本語やスペースを含む文字列も即座に%XX形式へ変換でき、逆変換で二重エンコードのチェックにも使えます。ブラウザ完結・外部送信なし。

今すぐ試す →

1. なぜスペースをそのままURLに書けないのか / Why raw spaces break URLs

URLの仕様(RFC 3986)では、使用できる文字が英数字と一部の記号(- . _ ~ など)に 限定されています。スペースはこの「安全な文字」の集合に含まれないため、そのまま使うと URLの区切りとして誤解釈されたり、ブラウザやサーバーによって挙動が変わったりします。 この問題を解決するのがパーセントエンコードです。

元の文字列: my file.txt
NG: https://example.com/my file.txt   (スペースがそのまま含まれ不正)
OK: https://example.com/my%20file.txt (%20でエンコード済み)

2. %20の仕組み / How %20 works

パーセントエンコードは「% + そのバイトの16進数2桁」という単純なルールです。 スペース(半角空白)のASCII/UTF-8コードは 0x20 なので、%20 になります。

文字コードパーセントエンコード
スペース0x20%20
/0x2F%2F
?0x3F%3F
&0x26%26
#0x23%23
%0x25%25
あ (UTF-8 3バイト)E3 81 82%E3%81%82

3. %20 と + の使い分け / %20 vs. +

検索結果のURLなどで q=hello+world のように + がスペースとして 表示されているのを見たことがあるはずです。これは application/x-www-form-urlencodedという、HTMLフォーム送信由来の別ルールに基づく慣習で、パーセントエンコードそのものではありません。

コンテキストスペースの表現備考
URLのパス部分%20+ はリテラルの+として解釈される
クエリ文字列(RFC 3986準拠)%20JSのURLSearchParamsは内部で+を使うことがある
application/x-www-form-urlencoded(フォーム送信)+ または %20HTMLフォームの伝統的な慣習

迷ったら常に%20を使うのが安全です。%20はどちらの文脈でも正しく スペースとして解釈されますが、+はパス部分では文字通りの「+」記号になってしまいます。

4. encodeURIComponent と encodeURI の違い / encodeURIComponent vs. encodeURI

JavaScriptにはURLエンコード用の関数が複数ありますが、対象範囲が異なります。古いescape() はUTF-8非対応かつ非推奨のため使用を避けてください。

const value = "hello world/foo?bar";

encodeURIComponent(value);
// "hello%20world%2Ffoo%3Fbar"  ← / ? もエンコードされる(部品として扱う)

encodeURI(value);
// "hello%20world/foo?bar"      ← / ? は構造記号として保持される

// クエリパラメータの値を組み立てる時は必ずencodeURIComponentを使う
const url = `https://example.com/search?q=${encodeURIComponent("東京 タワー")}`;
// "https://example.com/search?q=%E6%9D%B1%E4%BA%AC%20%E3%82%BF%E3%83%AF%E3%83%BC"

encodeURIComponent はURLの「一部品(パラメータの値など)」を、encodeURI はURL「全体」を対象にする関数です。クエリパラメータの値には ほぼ常に encodeURIComponent が正解です。

他言語での実装例

# Python
from urllib.parse import quote, quote_plus
quote("hello world")        # 'hello%20world'
quote_plus("hello world")   # 'hello+world' (フォーム送信互換)

// Java
java.net.URLEncoder.encode("hello world", "UTF-8"); // "hello+world" (フォーム互換、+を使う点に注意)

// PHP
urlencode("hello world");   // "hello+world" (フォーム互換)
rawurlencode("hello world"); // "hello%20world" (RFC 3986準拠)

Java の URLEncoder と PHP の urlencode() は、名前に反して スペースを + にする「フォーム送信向け」の関数です。パス部分に使いたい場合は PHPなら rawurlencode() を選ぶ必要があります。

5. よくある間違い / Common mistakes

まとめ / Summary

url encode spaceの基本は「スペースは%20に置き換える」という単純な規則ですが、+ との使い分け、encodeURIComponentencodeURIの対象範囲の違い、二重エンコードの防止という3点を押さえておけば実務でのトラブルは 大きく減らせます。迷ったら%20とencodeURIComponentを選ぶのが最も安全な選択です。

Encode spaces as %20 in URL paths and RFC 3986-style query strings; reserve+ for the legacy application/x-www-form-urlencoded convention. Use encodeURIComponent for individual parameter values andencodeURI only when encoding a full URL you want to keep structurally intact. Always check whether a string is already encoded before encoding it again.

URL Encoder / Decoder

エンコード・デコードをワンクリックで切り替え可能。二重エンコードされていないか、デコードして中身を確認する用途にも使えます。

今すぐ試す →

よくある質問 / FAQ

%20とは何?
%20はスペース(半角空白、コードポイント0x20)のパーセントエンコード表現です。URLは仕様上スペースを直接含められないため、記号%に続けてASCIIコードを16進数2桁で表記します。
スペースは%20と+のどちらでエンコードすべき?
URLのパス部分やクエリのキー・値では%20が正式なパーセントエンコードです。+はapplication/x-www-form-urlencoded(HTMLフォーム送信やクエリ文字列の慣習)でのみスペースを表す特殊なエイリアスで、パス部分では+はリテラルの+記号として解釈されるため混同すると壊れます。迷ったら常に%20を使うのが安全です。
encodeURIComponentとencodeURIの違いは?
encodeURIComponentはクエリパラメータの値など「URLの一部品」をエンコードする用途で、/ ? & = などURLの構造を担う記号もエンコード対象にします。encodeURIは「URL全体」をエンコードする用途で、これらの構造記号はエンコードせず保持します。クエリパラメータの値には常にencodeURIComponentを使うのが正解です。
How do I avoid double-encoding a URL?
Double-encoding happens when a string that already contains %20 gets encoded again, turning it into %2520. Encode raw, human-readable values exactly once, right before building the final URL — never encode a URL you received from elsewhere without first checking whether it's already encoded. When in doubt, decode first with decodeURIComponent, then re-encode from the clean value.
日本語やスペースを含むURLはどう扱われる?
日本語などマルチバイト文字は、まずUTF-8のバイト列に変換してから各バイトを%XX形式でパーセントエンコードします。ブラウザのアドレスバーは表示上デコードされた文字列を見せますが、実際にサーバーへ送信されるHTTPリクエストラインは常にパーセントエンコードされたASCII文字列です。

関連ツール / Related tools

関連ガイド / Related guides