UltKit

URLエンコード・デコード

テキストをURLに入れても問題ない形に変換したり、%20のような文字列を読める文字に戻したりできます。ブラウザ標準のencodeURIComponent、encodeURI、decodeURIComponentを使い、クエリパラメータを表にまとめて表示します。サーバーには何も送信しません。

モード

0 文字 · 0 語 · 0 行

0 文字 · 0 語 · 0 行

すべてこのブラウザのタブ内で処理されます。テキストがアップロードされたり保存されたりすることはありません。

各関数がエスケープする文字

ブラウザの関数自体で算出しています。encodeURIComponent は英字、数字、次の記号をそのまま残します: ! ' ( ) * - . _ ~

文字encodeURIComponentencodeURI
(スペース)%20%20
!!!
"%22%22
#%23#
$%24$
%%25%25
&%26&
'''
(((
)))
***
+%2B+
,%2C,
/%2F/
:%3A:
;%3B;
=%3D=
?%3F?
@%40@
[%5B%5B
]%5D%5D
{%7B%7B
}%7D%7D
|%7C%7C
\%5C%5C
^%5E%5E
`%60%60
<%3C%3C
>%3E%3E
~~~
---
___
...
é%C3%A9%C3%A9
€%E2%82%AC%E2%82%AC
😀%F0%9F%98%80%F0%9F%98%80

パーセントエンコードとRFC 3986の予約文字

URLに使えるASCII文字は限られています。2005年に策定されたURI構文の仕様であるRFC 3986は、それらを2つのグループに分けています。非予約文字(A–Z、a–z、0–9、および記号の - . _ ~ の4つ)は、エンコードする必要がありません。予約文字にはそれぞれ役割があります。一般区切り文字 : / ? # [ ] @ はスキーム、ホスト、パス、クエリ、フラグメントを区切り、サブ区切り文字 ! $ & ' ( ) * + , ; = はその内部の項目を区切ります(クエリ文字列での & と = がその例です)。それ以外の文字や、通常のデータとして使う予約文字は、パーセントエンコードが必要です。

パーセントエンコードは、1バイトを % とそれに続く2桁の16進数で表します。テキストはまずUTF-8に変換されるため、スペースは %20、é(2バイト)は %C3%A9、絵文字は4つの %XX になります。そのため、「café & bar」の検索はリンク内で caf%C3%A9%20%26%20bar となります。& をエンコードしておくことで、サーバーが新しいパラメーターの開始と誤解しません。

encodeURIComponent・encodeURIとデコードの違い

クエリの値、パスの一部分、パラメーターとして渡すリダイレクトURLのように、1つの部分だけを扱うなら encodeURIComponent が適切です。非予約文字と、JavaScriptが歴史的な理由でそのまま残す ! ' ( ) * 以外はすべてエスケープされます。encodeURI(URL全体) は、入力がすでに完全なアドレスであると想定して予約文字をそのまま残すため、https://example.com/a b?q=1 ではスペースだけがエンコードされます。パラメーターの値にencodeURIを使うのはよくあるバグです。値に含まれる & や # が残ったままになり、URLが壊れます。

デコードは、どちらの関数の処理も元に戻します。GETで送信されるHTMLフォームは、古い application/x-www-form-urlencoded 形式を使い、スペースを %20 ではなく + で表します。その場合は + をスペースとして扱う にチェックを入れたままにし、電話番号のようにプラス記号そのものが必要な場合はチェックを外してください。% の後ろに2桁の16進数がない場合や、UTF-8として無効なバイトが含まれる場合は、推測せずに分かりやすいメッセージを表示してデコードを失敗とします。テキストにクエリ文字列が含まれていれば、ツールの下の表にデコードされたパラメーターが表示されます。URL内でバイナリデータを扱う場合は、Base64url が一般的な代替手段です。

よくある質問

URLのスペースは%20と+のどちらにすべきですか?
パスでもRFC 3986でも、スペースは %20 です。+ がスペースを意味するのは、HTMLフォームと同じ方式でエンコードされたクエリ文字列の中だけなので、どこでも安全に使えるのは %20 です。
URLに%2520が入ってしまうのはなぜですか?
二重にエンコードされています。1回目でスペースが %20 になり、2回目で % 自体が %25 にエンコードされたためです。余分な1層を戻すには1回デコードしてください。値のエンコードは、コード内の1か所だけで行いましょう。
パーセントエンコードが不要な文字はどれですか?
RFC 3986の非予約文字です。大文字と小文字のA~Z、数字の0~9、そしてハイフン、ピリオド、アンダースコア、チルダです。
日本語などの文字はエンコードせずにURLに使えますか?
ブラウザ上では表示されますが、通信ではパスやクエリ内のASCII以外の文字はすべてパーセントエンコードされたUTF-8として送られます。ドメイン名は別の仕組みのPunycodeを使い、xn-- で始まるラベルに変換されます。
デコード時に不正なシーケンスと表示されるのはなぜですか?
テキストに、後ろに2桁の16進数が続かない % が含まれている(たとえば「100%」のような文字そのもの)か、バイト列がUTF-8として無効な場合です。デコードする前に、単独の % を %25 にエンコードしてください。