メインコンテンツへスキップ

← ブログ一覧へ

URL エンコード徹底解説:パーセントエンコード・空白 %20・日本語・オンライン変換

リンクを貼ったら本来は文字のはずの場所に %E3%81%82 が現れたり、クエリパラメータが謎に壊れたりした経験はありませんか?それが URL エンコードの働きです。仕組みが分かれば、あの謎の文字列を読んで筋道立てて扱えるようになります。

入力ひとつに要点が 3 つ。 URL エンコーダー台北 101 & friends? を符号化すると、こうなりました。

%E5%8F%B0%E5%8C%97%20101%20%26%20friends%3F

この文字列から 3 つのことが分かります。漢字 1 文字が 3 バイト(%E5%8F%B0)になっているのは、UTF-8 が CJK に 3 バイト必要とするからです。空白は %20 になり、+ にはなりません —— プラス形式はフォーム本体のもので、パスのものではありません。そして &? が escape されたのは、そのままだと値が終わって新しいパラメーターが始まってしまうからです。同じ文字列を貼れば見比べられます。

URL エンコードとは?

URL エンコードは**パーセントエンコード(percent-encoding)**とも呼ばれ、URL にそのまま置けない文字や、置くと誤解釈される文字を安全な形に書き換える仕組みです。対象の文字を % とそのバイトの 2 桁 16 進数に置き換えます。空白は %20&%26、日本語の「あ」(UTF-8)は 3 バイトで %E3%81%82 になります。

このルールは URL の標準規格 RFC 3986 に基づきます。目的はシンプルで、URL がコピーされても、メールで送られても、どのサーバーで解析されても、曖昧さなく通じるようにするためです。

URL エンコード / デコードツールなら、任意の文字列をその場で変換できます。処理はすべてブラウザ内で完結します。

なぜ URL にエンコードが必要か

URL には限られた ASCII 文字しか入れられません。その範囲を超えるもの —— 空白、アクセント付き文字、日本語などの非 ASCII 文字、あるいは ?&#/ のように特別な意味を持つ記号 —— は、URL の構造と取り違えられないようパーセントエンコードが必要です。

たとえば ? は URL の中でクエリ文字列の開始を表します。もし「ある値の中に」文字どおりの疑問符を入れたいなら %3F と書かなければならず、そうしないと解析器はそれ以降をすべてパラメータとして扱ってしまいます。エンコードはこの曖昧さを取り除きます。

よく使う記号の変換

遭遇しやすい記号とそのパーセントエンコード形は次のとおりです。

文字エンコード後備考
空白%20+ はフォームデータのみ(後述)
&%26クエリパラメータの区切り
?%3Fクエリ文字列の開始
=%3Dキーと値の区切り
#%23フラグメントの開始
/%2Fパスの区切り
+%2B空白と誤読されないための文字どおりのプラス
%E3%81%82非 ASCII、UTF-8 のバイトごとに変換

非 ASCII 文字(日本語、中国語、絵文字、アクセント付きラテン文字)は、まず UTF-8 のバイト列に変換され、その各バイトがパーセントエンコードされます。見た目 1 文字が複数の %XX に膨らむのはこのためです。

私たちの URL エンコーダーに 1 つの文字列を通した結果です。台北 101 & friends?%E5%8F%B0%E5%8C%97%20101%20%26%20friends%3F になります。ここから 3 つの事実が読めます。漢字 1 文字が 3 バイトを占めたこと、空白が + ではなく %20 になったこと、そして &? が escape されたこと(そのままだと値が終わり、新しいパラメーターが始まってしまいます)。

RFC の表を改めて載せるより、私たちのURL エンコーダーが8 つの入力に対して実際に返した結果を置きます。各カテゴリを少なくとも 1 つ含むように選びました。うち 2 つはそのまま返ってきます。そこが要点です。~ _ . -非予約文字なので、正しいエンコーダーは触ってはいけません。

入力エンコード後
hellohello
hello worldhello%20world
a+b=ca%2Bb%3Dc
100%100%25
台北%E5%8F%B0%E5%8C%97
?q=x&r=y%3Fq%3Dx%26r%3Dy
a/ba%2Fb
~_.-~_.-

予約文字 vs 非予約文字

  • 非予約文字(A–Z a–z 0–9 - _ . ~)はエンコード不要です。
  • 予約文字(: / ? # [ ] @ ! $ & ' ( ) * + , ; =)は URL 内で構造的な意味を持ちます。エンコードするかは文脈次第 —— の中では必須、構造として使うときは不可です。

この違いこそ、次の encodeURIComponentencodeURI の使い分けの核心です。

いつエンコードすべきか

ひとことで言えば、エンコードするのは「URL に入れる部品」であって「組み上がった URL 全体」ではありません。

  • エンコードするのは、これから差し込む —— 検索語、ファイル名、リダイレクト先、ユーザー入力や別システム由来のものなど。
  • 完成した URL 全体をむやみにエンコードしないこと。構造を支える / ? & = まで一緒にエスケープされ、リンクが壊れます。

役立つ考え方:URL の構造は自分で組み立て、各部品は「差し込む前に」それぞれエンコードする。パラメータ値「赤 と 青」をエンコードすると %E8%B5%A4%20%E3%81%A8%20%E9%9D%92 になり、?color=... に安全に収まります。

encodeURIComponent vs encodeURI

  • encodeURIComponent は予約文字もエンコードします。単一の値(1 つのクエリパラメータ、1 つのパスセグメント)に使います。
  • encodeURI は構造文字(/ ? & =)を保持します。分割したくないURL 全体に使います。
encodeURIComponent("a b&c=d") // "a%20b%26c%3Dd"  ✅ 値として安全
encodeURI("https://x.com/a b") // "https://x.com/a%20b"  ✅ URL 全体

選び間違いはよくあるバグの原因です。値に encodeURI を使うと中の & がエスケープされず、クエリ文字列が壊れます。

空白のエンコード:%20 と +

空白はどの文字よりも人を悩ませます。%20+ はどちらも空白を表せますが、使う場面が異なります。

  • URL パスや現代のクエリ文字列では標準は %20
  • 空白を + にするのは、HTML フォーム送信で使われる古い application/x-www-form-urlencoded 形式に由来します。この形式では、文字どおりの + は逆に %2B と書く必要があります。

迷ったら %20 が安全で普遍的な選択 —— 当ツールもこれを出力します。

対照として、同じ文字列を Base64 ツールに通すと 5Y+w5YyXIDEwMQ== です。出発点は同じ UTF-8 バイト列ですが、そこから完全に分かれます。Base64 は全バイトを 64 文字のアルファベットで表し直し 4 の倍数までパディングし、パーセントエンコードは安全な文字をそのまま残して残りだけを escape します。

+ の混乱もここから始まります。私たちのエンコーダーは a+b=c に対して a%2Bb%3Dc を返します。プラス記号自体が %2B になります。そうせざるを得ません。もし文字どおりの + を残せば、+ を空白として読むデコーダーは値を黙って壊します。フォームのデコーダーはまさにそう読みます。つまり「空白としての +」と「プラスとしての +」は未エンコードで共存できません。エンコーダーは裸の + を一切出さないことで決着させています。

典型的な二重エンコードのバグ

文字列を 2 回エンコードすると、%20%2520 になります(% 自身が %25 にエンコードされるため)。症状:ブラウザに文字どおりの %20 が出る、空白が %2520 になる、など。解決策はちょうど 1 回だけエンコードすること —— 入力の状態が不明ならまずデコードします。デコードツールで今何を持っているか簡単に確認できます。

同じ仕組みが二重エンコードも説明します。% も URL では安全ではなく、私たちのエンコーダーは 100%100%25 にします。その出力をもう一度通すと %25%2525 へ。依然として妥当な URL で、依然としてデコードできますが、デコード結果は別の文字列です。二重エンコードは決して構文エラーにならない —— だから本番まで生き残ります。

オンラインで URL をエンコード / デコードする方法

16 進数の対応表を覚える必要はありません。テキストや URL をオンライン URL エンコード / デコードツールに貼り、「エンコード」と「デコード」を切り替えて結果をコピーするだけです。処理は完全にブラウザ内で行われるため、貼り付けた内容はアップロードされません —— トークンや個人情報を含むリンクでも安心です。バイナリデータやヘッダーを扱うなら Base64 の出番で、Base64 と URL エンコードの違いでそれぞれの使いどころを解説しています。

よくある質問

普通に見える URL は、共有する前にエンコードが必要? たいてい不要です —— ブラウザですでに動いているなら問題ありません。エンコードすべきは、新しい URL に組み込む値だけです。

なぜ & でリンクが 2 つに切れた? エンコードされていない & は新しいクエリパラメータを始めてしまいます。値の中では %26 と書く必要があります。

リンクに %2520 が出るのはなぜ? 二重エンコードされた空白です。1 回デコードすれば元の %20 に戻ります。

%20+ は入れ替えてよい? x-www-form-urlencoded のフォーム本文の中だけです。パスや一般のクエリ文字列では %20 を優先してください。

クイックリファレンス

  • パラメータ値をエンコード?→ encodeURIComponent
  • URL 全体をエンコード?→ encodeURI
  • 空白を入れたい?→ %20(+ はフォームデータのみ)。
  • 見慣れない %XX?→ デコードして原文を読む。

無料の URL エンコード / デコードツールで URL とクエリパラメータをその場でエンコード・デコードできます —— すべてブラウザ内で動作します。