検索クエリをエンコードする
hello world & more
hello%20world%20%26%20more
スペースは %20 に、& は %26 になります。& をそのまま残すとクエリパラメータの区切り文字と誤解されてしまうためです。
URL コンポーネントを安全にエンコード / デコード。
最終更新
URL エンコーダー(パーセントエンコーダー、URI エンコーダーとも呼ばれます)は、URL 内で予約されていたり安全でない文字を、% と 2 桁の 16 進数の組み合わせに置き換えるツールです。クエリ文字列の組み立て、パスのエスケープ、空白や非 ASCII 文字を含む URL の共有、リダイレクト周りのデバッグなど、出番は意外と多いはずです。
URL に使える文字は ASCII のごく一部に限られています。空白、アクセント付き文字、絵文字、データとして使う ? # & = のような予約記号は、ブラウザからサーバーまで壊れずに届くようにパーセントエンコードしておく必要があります。
JavaScript には 2 種類のエンコード関数があります。encodeURI は URL の構造(/ ? # & など)を残し、encodeURIComponent は予約文字をすべてエンコードします。クエリ文字列に差し込む *値* には encodeURIComponent、URL 全体をそのまま使いたいときは encodeURI というのが基本の使い分けです。
% + 16 進数 2 桁に置き換える仕組み。たとえば半角スペースは %20 になります。: / ? # & = +)は URL の構造上の意味を持つため、区切り文字ではなくデータとして使うときはエンコードが必須です。生の文字列を URL セーフにしたいなら Encode、% を含むエンコード済みの文字列を元に戻したいなら Decode を選びます。
クエリ文字列の値には encodeURIComponent(予約文字を全部エンコード)、URL 全体を扱いたいときは encodeURI(構造を保持)を選びます。
生の文字列、もしくはエンコード済みの URL を貼り付けます。複数行をまとめて入力すれば一括デコードも可能です。
エンコード結果やデコード結果をコピーして使います。変換はすべてブラウザ内で行われるため、URL に含まれる秘密情報が外部に送信されることはありません。
実際によく見かけるエンコード結果のまとめ。予約文字の意味は RFC 3986 に基づいています。
| 文字 | エンコード後 | 理由 |
|---|---|---|
| 半角スペース | %20 | URL にスペースは入れられない |
! | %21 | サーバーによっては予約扱い |
# | %23 | フラグメントの開始記号 |
$ | %24 | 予約文字 |
& | %26 | クエリパラメータの区切り |
+ | %2B | フォームエンコードでは半角スペースを表す |
/ | %2F | パスの区切り文字 |
: | %3A | スキームとホストの区切り |
= | %3D | クエリ文字列のキーと値の区切り |
? | %3F | クエリ文字列の開始記号 |
@ | %40 | ユーザー情報とホストの区切り |
| UTF-8 バイト | %C3%A9 | 非 ASCII の各バイトを順にエンコード |
hello world & more
hello%20world%20%26%20more
スペースは %20 に、& は %26 になります。& をそのまま残すとクエリパラメータの区切り文字と誤解されてしまうためです。
café
caf%C3%A9
é は UTF-8 で 0xC3 0xA9 という 2 バイト列になるため、1 文字に対して %XX が *2 つ* 並ぶ形になります。
https://example.com/path?q=hello world
https://example.com/path?q=hello%20world
https%3A%2F%2Fexample.com%2Fpath%3Fq%3Dhello%20world
encodeURI はスラッシュや ?、= といった URL の構造をそのまま残します。一方 encodeURIComponent は予約文字をすべてエンコードするので、クエリ文字列に差し込む値専用と覚えておくと安心です。URL 全体に対して使うのは NG。
encodeURI を使ってしまう。& や = がエンコードされず素通りするので、パラメータの解釈が壊れます。%20 のはずが %2520 になっているのは、二重にエンコードしてしまった典型的なサインです。+ の扱い違い。application/x-www-form-urlencoded のボディでは半角スペースを意味しますが、URL のパスやクエリでは普通の + のままです。% と 16 進数 2 桁の組み合わせに置き換えて表現する仕組みです。encodeURI は URL の構造を担う文字(/ ? # & = +)をエンコードしません。encodeURIComponent はそれらもすべてエンコードするので、クエリパラメータの値、パスセグメント、フラグメントなど URL に埋め込む *個別の値* にはこちらを使います。詳細は MDN の encodeURI と encodeURIComponent を参照してください。%20 になるのですか?0x20)をパーセントエンコードした %20 で表現します。decodeURI や decodeURIComponent、各種 URL デコーダーを使えばパーセントエンコードを解除して元の文字列を復元できます。