原理を知っていれば納得な話なんですが、仕様に基づいた整理。
出典
RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax
どういうことか
RFC3986では予約文字(Reserved Character)と非予約文字(Unreserved Character)という表現で利用できる文字が定義されている。
非予約文字は「利用可能な文字」を表すもので、対象としては以下の文字が定義されている。
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
- ALPHA(アルファベットA-Z,a-z)
- DIGIT(数字0-9)
- -(ハイフン)
- .(コロン)
- _(アンダーバー)
- ~(波線)
これらの文字はそのまま利用可能な文字なので、逆に考えるとこの文字はパーセントエンコーディングするべきではない文字ということになる。
ただ、エンコーディングを完全にしてはいけないというわけではなく、ちゃんと意味が通るようにエンコーディングされていればよい。
たとえば A0あ0
という文字列をURLエンコーディングさせたい場合は、通常は
A0%E3%81%820
となるが、0を %30
とエンコードして
A0%E3%81%82%30
としても問題はない。