显然 % 需要被编码。关于标准的维基百科文章说:
因为百分比 ("%") 字符用作百分比编码八位位组的指示符,所以它必须以百分比编码为 "%25",才能将该八位位组用作 URI 中的数据。
为什么它不被列为保留字符?显然,它被保留以表示 URI 上下文中的特殊内容......
“保留”字符旨在用作 URI 不同部分之间的分隔符。百分号不用于那个 - 不能用于那个 - 因为它用于百分比编码。
指出有一个单独的“未保留”字符列表可能有助于澄清问题,而百分号也不是其中之一:
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
(来自http://www.ietf.org/rfc/rfc3986.txt,第 12 页底部)。换句话说,在 URI 的上下文中,“保留”具有比人们预期的更具体的含义。:-)
通过参与语法规则,百分号已经被保留pct-encoded
。此外,这一段似乎对这个主题很有启发性:
URI 由一组有限的字符组成,这些字符由数字、字母和一些图形符号组成。这些字符的保留子集可用于分隔 URI 内的语法组件,而其余字符(包括未保留集和不充当分隔符的那些保留字符)定义每个组件的标识数据。
这表明百分比符号本身确实是为百分比编码保留的(因为它没有在 URI 中分隔语法组件)。您的原始解释是正确的,我认为这只是语义问题。
保留字符是在 URI中具有特殊含义的字符,因此如果它们用于其特殊目的以外的其他用途,则需要以某种方式进行转义。
百分比字符在 URI 中没有特殊含义——这使得它成为转义/编码字符的好选择。
它被用于进行编码的事实是百分比本身需要通过百分比编码来转义的唯一原因。
这类似于字符转义,其中反斜杠\
本身必须被转义,\\
只是因为它是选择进行初始转义的字符,如\t
或\n