使い方
- 「エンコード」または「デコード」を選択します。
- 1つの値(クエリパラメーターなど)には「コンポーネント」、URL全体には「完全なURL」を選択します。
- テキストを入力または貼り付けます。結果は右側(スマートフォンでは下側)にすぐ表示されます。
- 結果をコピーするか、「出力を入力として使用」で逆の処理を行い、元に戻ることを確認します。
仕組み
URLに使用できるASCII文字は限られています。スペース、アクセント付き文字、絵文字など、それ以外の文字はパーセントエスケープで表します。文字をUTF-8のバイト列に変換し、各バイトを%に続く2桁の16進数で表記します。スペースは%20、éは%C3%A9、€は%E2%82%ACになります。
コンポーネントモードでは、JavaScriptのencodeURIComponentとdecodeURIComponentを使用します。/ ? # & = + : @など、URLで特別な意味を持つ文字をすべてエスケープするため、クエリ値やパスの1セグメントに安全に配置できます。A–Z、a–z、0–9、- _ . ! ~ * ' ( )はそのままです。
完全なURLモードでは、encodeURIとdecodeURIを使用します。入力がすでに完全なURLであることを前提とし、予約文字の; , / ? : @ & = + $ #はそのままにして、URLが機能する状態を保ちます。デコード時も、decodeURIはこれらの予約文字のエスケープをそのまま残します。%2Fを/に変えるとURLの意味が変わるため、%2Fのままになります。
フォームデータのオプションは、HTMLフォーム送信時にブラウザーが使うapplication/x-www-form-urlencoded形式に従います。この形式では、スペースを%20ではなく+で表します。このオプションでデコードすると、すべての+がスペースになります。実際のプラス記号は%2Bと表記する必要があります。
入力が無効でも、内容が破棄されることはありません。%の後に2桁の16進数が続かない場合や、エスケープの並びが有効なUTF-8にならない場合は、問題の位置を表示し、修正できるようテキストを保持します。
使用例
クエリ文字列に値を入れる
https://example.com/search?q=…で「Rock & Roll」を検索するには、コンポーネントモードで値だけをエンコードします:Rock%20%26%20Roll。エンコードしないと、&がqパラメーターを終わらせ、新しい「 Roll」パラメーターが始まってしまいます。
スペースやアクセント付き文字を含むURLを修正する
完全なURLモードでは、https://example.com/menu/crème brûlée.htmlはhttps://example.com/menu/cr%C3%A8me%20br%C3%BBl%C3%A9e.htmlになります。スラッシュとコロンはそのままなので、リンクは引き続き機能します。
ログに記録されたフォームデータを読む
サーバーログにname=Jane+Doe&city=S%C3%A3o+Pauloと記録されています。「+をスペースとして扱う」をオンにしてコンポーネントモードでデコードすると、name=Jane Doe&city=São Pauloと読めます。
よくある質問
encodeURIとencodeURIComponentの違いは何ですか?
encodeURIComponentはURLの各部分を区切る文字(/ ? # & = + : @など)をエスケープするため、URLの一部分に使います。encodeURIはこれらの文字を保持するため、完全なURLに使います。クエリ値にencodeURIを使うのはよくあるミスです。値に含まれる&や=がエスケープされず、クエリ文字列が壊れてしまいます。
スペースは%20と+のどちらで表しますか?
URLのパスでは、スペースは常に%20です。クエリ文字列ではどちらも使われます。%20はどこでも有効ですが、+がスペースを表すのはフォームデータ(application/x-www-form-urlencoded)の場合に限られます。これはHTMLフォームや多くのサーバーフレームワークがクエリ文字列を読み取る際に使う形式です。迷った場合は%20を使ってください。
デコード時にエラーが発生するのはなぜですか?
%記号の後に2桁の16進数が続かない場合(例:「50% off」)、またはエスケープされたバイト列が有効なUTF-8でない場合に、デコードに失敗します。後者は通常、古い文字コード(éを%C3%A9ではなく%E9とするLatin-1など)でエンコードされたことを意味します。エラーメッセージに問題の位置が表示されます。
完全なURLモードで%2Fがスラッシュにならないのはなぜですか?
decodeURIは、/ ? # & =などの予約文字のエスケープを意図的にそのまま残します。デコードするとURLの分割方法が変わる可能性があるためです。すべてのエスケープをデコードするには、コンポーネントモードを使ってください。
エンコードされない文字はどれですか?
どちらのモードでも、A–Z、a–z、0–9、- _ . ! ~ * ' ( )はエンコードされません。完全なURLモードではさらに、; , / ? : @ & = + $ #もそのままです。
プライバシー
エンコードとデコードは、ブラウザーに組み込まれたJavaScript関数を使ってすべてブラウザー内で処理されます。テキストやURLがアップロード、保存されたり、アクセス解析に含まれたりすることはありません。