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

← ブログ一覧へ

URL エンコード徹底解説:パーセントエンコード・クエリ文字列・壊れたリンク

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

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

URL には限られた ASCII 文字しか入れられません。それ以外 —— 空白、日本語、あるいは ?&#/ のように特別な意味を持つ文字 —— はすべてパーセントエンコードが必要です。% にそのバイトの 2 桁の 16 進数を続けた形に置き換えます。例えば空白は %20(UTF-8)は %E3%81%82 になります。

URL エンコードツールで任意の文字列を即座にエンコード・デコードできます。

予約文字 vs 非予約文字

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

これが encodeURIComponentencodeURI の違いの核心です。

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 vs +

どちらも空白を表せますが、文脈が異なります。URL パスや現代のクエリ文字列では標準は %20。空白を + にするのは、HTML フォーム送信で使われる古い application/x-www-form-urlencoded 形式に由来します。迷ったら %20 が安全で普遍的な選択 —— 当ツールもこれを出力します。

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

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

クイックリファレンス

  • パラメータ値をエンコード?→ encodeURIComponent
  • URL 全体をエンコード?→ encodeURI
  • 見慣れない %XX?→ デコードして原文を読む。

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