【ぱーせんとえんこーでぃんぐ】

パーセントエンコーディング とは?

最終更新:
💡 URLの区切りと値を見分ける「%付きの表記ルール」

URLなどの中で、1バイトを「%」と2桁の16進数で表す方法。区切りとして使われる記号や、そのままでは使えない文字のデータを表現します。

📌 このページのポイント
文字 → バイト列 → %付きの表記 あ E3 81 82 %E3%81%82 UTF-8 各バイトを %XXへ 1文字 3バイト 表記は9文字 %20を再び値として符号化すると%2520 文字コードとURL内の役割を区別する 暗号化ではない
UTF-8を使った例。必要な文字をURLの部品ごとの規則に従って符号化します。
ひよこ ひよこ
URLにある%20って、何かの暗号なの?
ペンギン先生 ペンギン先生
暗号ではなく表記の決まりだよ。%の後の16進数2桁で1バイトを表すんだ。ASCIIの空白は16進数で20なので、%20と書けるよ。
ひよこ ひよこ
日本語も%と数字になるの?
ペンギン先生 ペンギン先生
UTF-8を使う例なら、「あ」はE3 81 82という3バイトなので%E3%81%82になるよ。1文字を1個の%XXにするわけではなく、バイトごとに変換するんだ。
ひよこ ひよこ
記号をそのまま書くとどうなるの?
ペンギン先生 ペンギン先生
区切りとして読まれる場合があるよ。たとえばフォーム形式のクエリで、1つの値としてa&bを渡したいなら、&を%26と表せるんだ。URL全体の区切りまで一括で変換するのではなく、値などの部品を扱うのが大切だね。
ひよこ ひよこ
何回変換しても同じになるのかな?
ペンギン先生 ペンギン先生
同じにはならないよ。%自体をデータとして表すと%25になるから、%20をもう一度値として変換すると%2520になるんだ。どこで符号化し、どこで元に戻すかを決めて、同じ段階で二重に処理しないようにしよう。
もっと詳しく知りたい人へ

空白が%20ではなく+になっているのはなぜ?

application/x-www-form-urlencodedというフォーム形式では、空白を+で表す決まりがあるよ。この形式で文字としての+を渡すなら%2Bを使うんだ。URLのすべての部分で+が空白になるわけではないので、使っている形式を確認しよう。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「パーセントエンコーディング」って出てきたら「URLでバイトを%XXと書く方法」と思えればだいたいOK!
📖 おまけ:英語の意味
「Percent-Encoding」 = パーセント記号を使った符号化
💬 符号化したバイトを示す先頭に%を使うため、この名前で呼ばれるんだよ。

参考資料

← 用語集にもどる