よくある質問
URL エンコードは暗号化と同じですか?
いいえ。パーセントエンコーディングは鍵なしで誰でも復元できる可逆変換です。任意のテキストを URL の構文(`?`・`&`・`=`・スペース・`#` がすでに構造的な意味を持つ)に収めるための仕組みであり、内容を隠す目的ではありません。セキュリティ層として使ってはいけません。
encodeURI と encodeURIComponent — このツールはどちらを使いますか?
encodeURIComponent です。この違いは重要です。encodeURI は `:` `/` `?` `&` `#` といった URL の構造文字を保持し、URL 全体を扱うのに向きます。一方 encodeURIComponent はそれらもエスケープし、URL に埋め込む個別の値を扱うのに向きます。URL 全体を貼り付けてクエリ値だけを変換したい場合は、先に手で分割してください。
デコードしたとき `+` がスペースにならないのはなぜですか?
encodeURIComponent はスペースを `%20` でエンコードし、`+` は生成しません。`+` = スペースという規約は、HTML フォーム送信が使う古い `application/x-www-form-urlencoded` 形式のものです。入力が `+` をスペースとして使っているなら、本ツールでデコードする前に `+` を `%20` に置換するか、フォーム urlencoded 用デコーダを使ってください。
ブラウザの URL バーには `日本` と表示されるのに、貼り付けると `%E6%97%A5%E6%9C%AC` になるのはなぜですか?
現代のブラウザは可読性のためにパーセントエンコードされた UTF-8 を元の文字として表示しますが、正確な伝送のため内部的にはエンコード済みの生の形を保持し、コピーします。両者は同じ URL の等価表現であり、本ツールではどちらも同じ文字列にデコードされます。
国際化ドメイン名(IDN)に対応していますか?
対応していません。本ツールは値側(パス・クエリ・フラグメント)のみを扱います。非 ASCII 文字を含むホスト名はパーセントエンコーディングではなく Punycode(`xn--…`)を使い、別の変換が必要です。現代のブラウザは Unicode 形式で表示しますが、内部では Punycode で伝送します。
エンコーダが `-`・`_`・`.`・`~` をそのまま残すのはなぜですか?
これら 4 文字は RFC 3986 で *非予約* 文字集合と定められており、URL の構造文字と紛れる余地がないためエスケープ不要です。encodeURIComponent は意図的にそのまま通します。
関連する概念
パーセントエンコーディング(別名 URL エンコーディング)は RFC 3986 で定義されています。非予約文字集合(A–Z・a–z・0–9・`-` `_` `.` `~`)以外のバイトは `%` の後ろに大文字 16 進数 2 桁が続いた形になります。URL はバイト指向のため、非 ASCII テキストはまず UTF-8 に変換されてから各バイトがパーセントエスケープされます。3 バイトの韓国語音節が 9 文字(`%XX%XX%XX`)に膨らむのはそのためです。
JavaScript には関連する関数が 4 つあり、挙動が異なります。`encodeURI` と `decodeURI` は URL の構造文字(`: / ? & = # @`)を保持し、URL 全体を扱うのに向きます。`encodeURIComponent` と `decodeURIComponent` は構造文字もエスケープし、URL に埋め込む個別の値を扱うのに向きます。本ツールは後者のペアを使います。別の形式である `application/x-www-form-urlencoded` はスペースを `%20` ではなく `+` でエンコードし、HTML フォームが生成します。多くのバックエンドフレームワークは両方を受け付けます。
パーセントエンコーディングと混同されやすい隣接概念が 3 つあります。**Base64** はバイナリを ASCII テキストに詰めますが `+` と `/` を含み、それ自体が URL エスケープを必要とします(base64url がこの問題を解きます)。**HTML エンティティ**(`&`・`😀`)は HTML 向けのエスケープで、URL 向けではありません。**Punycode**(`xn--…`)はホスト名がパーセントエンコーディングを使えないため、国際化ドメイン名を扱います。