[31]
URL における予約とは、
文字の分類の1つでした。
[32]
URL で特別な意味を持つ (ことがある) 文字が属しています。
[30]
初期の URL 仕様はいろいろな概念が改訂ごとに少しずつ違っていることに定評(?)がありましたが、
予約文字もそのような混乱の代表的な事例といえます。
[26] 「予約」と言う時に、すべての予約文字のこと (ABNF における reserved
のこと) を指していることもあれば、特定の文脈において予約されている文字だけを指していることもあり、
注意が必要です。
[1]
- rfc1630.body.reserved = <[%/#?*]>
- rfc1630.reserved = <[=;/#?:]> / SP
- rfc1738.reserved = <[;/?:@&=]>
- rfc1808.reserved = rfc1738.reserved
- rfc2068.reserved = <[;/?:@&=+]>
- rfc2396.reserved = <[;/?:@&=+$,]>
- rfc2732.reserved = <[;/?:@&=+$,]> / "[" / "]"
- rfc3986.reserved = rfc3987.reserved = gen-delims / sub-delims = <[;/?:@&=+$,!'()*#]> / "[" / "]"
[22]
1630 -> 1738 では
#
と
%
と SP
が消えました。
そして
@
が新たに追加されました。
URI の範囲 (素片識別子及びその前の #
は URI に含まない。)
及び予約集合の意味
(方式によっては特別な意味を持ち得る文字種。)
を明確化した結果でしょう。
&
も新たに追加されましたが、
こちらは HTML
の form
機能の追加を受けたものです。
1738 -> 2396 で追加された
+
は従来問合せ文字列で間隔の代替とされていたもので、
区切り文字としての役割を明確化したと言えるでしょう。
(RFC 2068 は先取りしています。)
,
と
$
も区切りとして使われることがあるので取り上げて明確化したのでしょう。
- [11] 2396 G.2 の説明で余計わかりにくくなっている気がしますが、 reserved 集合に含まれている文字は方式やその示す資源によって特別な意味を持つ可能性がありますが、それ以外の文字についてはその可能性はありません。 (ないはずです。というのは、 unreserved の説明で unreserved 文字は escape してもしなくても等価であることが述べられているからです。)
[14] RFC 2732 は、
IPv6 アドレスを表現するために
unwise だった
[
及び
]
を reserved
に追加しました。
このことをどう解釈したらいいか微妙です。
- [15] 追加の目的は host 部分での
IPv6 adderess の表現を認めることだ。
2732 が改訂した生成規則 host
以外での両括弧の使用は認められない。
- [16] IPv6 アドレスを表現するという予約目的で両括弧の使用を認めると
2732 は言っている。 IPv6 アドレスを表現する限りは自由に使って良い。
- [17] reserved に両括弧は追加されたのだ。それ以上でもそれ以下でもない。
両括弧は今後 URI で自由に使える。
例で示すなら、
- [18] http://[0:2:3::5:5]/foo.example
- [19] x-some-scheme:foo:[0::1:2:3]:bar
- [20] x-some-scheme:foo[bar];
- [21] x-some-scheme:foo]bar
の >>18 例が 2732 の主目的なわけです。
>>15 は >>18 しか認めない意見。
>>16 は>>18 と >>19
はみとめる。 >>17 は >>20
も >>21 も OK という意見。
どれが正しいのでしょう?
[13] RFC 3986・RFC 3987 では
!
, '
, (
,
)
, *
, #
が追加されました。 #
は素片識別子が URI
の一部であることに定義が改められたことによるものでしょう。
*
が予約文字になってしまうと、
この文字をワイルド・カードとして使い、
本来の星印を百分率符号化オクテット表現にしていた
URIパターンは汎用性を失ってしまいます。。。
[24]
RFC 3986によると[
と]
が使えるのは命名権者部のIP番地としてだけです。
ということは、URI (素片識別子を除く。) を直接含むURIが一般には作れないことになります。。。
[3] 本文中の Reserved characters
と BNF の reserved
は何やら意味が違うみたいです。なお、 !
及び *
は BNF では extra
に分類されています。
[4] >>2 ではちょっとわかりにくいかもしれませんが、 =
も reserved
の一選択肢です (BNF の代入(というか定義)記号ではありません)。
[12] つまりですよ。 http://foo.example/foo:bar と http://foo.example/foo%3Abar は同じかどうか一意には定まらないということですな。そらー厄介だ。
[10] BNF では
と定義されています。
[23]
誤って URI 参照で使うことがみとめられていない文字のことを reserved
とか予約
とかいうことがあります。
URI で使えない文字とは異なり、
予約文字は URI では使えます。