percent-encodingの仕組み

URL percent-encoding(RFC 3986)の包括的ガイド。文字が%HH形式に変換される仕組み、エンコードが必要な文字とその理由を学びましょう。

Character

N/A

Encoded

%HH

詳細な説明

percent-encoding(URLエンコードとも呼ばれる)は、RFC 3986で定義された、URIにおいてそのままの形式では許可されない文字を表現するためのメカニズムです。エンコードされる各文字は、パーセント記号(%)の後に文字のバイト値を表す2桁の16進数が続くトリプレットに置き換えられます。

エンコードプロセス:

  1. 文字がエンコード必要かどうかを判断する(未予約セットの範囲外か?)
  2. UTF-8を使って文字をバイト表現に変換する
  3. 各バイトについて、%の後にバイト値の大文字16進数を出力する

例: スペース文字(ASCII 32):

  • 10進数:32
  • 16進数:20
  • percent-encoding:%20

RFC 3986で定義された文字セット:

未予約文字(エンコード不要): A-Z a-z 0-9 - _ . ~

予約文字(データとして使用する場合はエンコード): : / ? # [ ] @ ! $ & ' ( ) * + , ; =

その他すべての文字(常にエンコード必要): スペース、制御文字、非ASCII文字、および{ } | \ ^ < >`のような文字

マルチバイト文字の仕組み: ASCII外の文字はまずUTF-8バイトに変換され、次に各バイトがpercent-encodingされます:

é (eアキュート) → UTF-8: 0xC3 0xA9 → %C3%A9
✓ (チェックマーク) → UTF-8: 0xE2 0x9C 0x93 → %E2%9C%93

大文字・小文字の区別: RFC 3986は、percent-encodingトリプレットの16進数字は大文字・小文字を区別しないと述べています(%2f%2Fは等価)。ただし、一貫性のために大文字が推奨されており、JavaScriptのエンコード関数が生成する形式でもあります。

デコード: percent-decodingはプロセスを逆転させます。%が見つかると、続く2つの16進数字を読み取り、バイトに変換し、UTF-8を使ってバイトを文字に組み立てます。無効なシーケンス(%GGや途中で切れた%2など)はエラーとして扱うべきです。

落とし穴: よくある誤解は、percent-encodingがHTMLエンティティエンコードやBase64エンコードのようなものだというものです。そうではありません。percent-encodingはURL固有であり、個別のバイトのみをエンコードします。他のエンコードスキームと混同すると、二重エンコードバグやデータ破損につながります。常にプログラミング言語が提供するURL固有のエンコード関数を使用してください。

ユースケース

すべてのURLエンコードの基盤となるメカニズムの理解。Web API、フォーム送信、リンク生成に携わるすべての開発者に必須の知識。

Try It — URL Encoder

フルツールを開く