URL 的片段部分从第一个
#
字符到达 URL 的末尾。由于像 %
、?
和 &
这样的保留字符在片段中没有特殊含义,因此不需要在 URL 片段中对它们进行百分比编码,对吗?
换句话说:我相信 URL 片段 #%
和
#%25
都应该被允许并且不相等。以下代码片段支持这一观点,因为使用
http://server/#%
加载它(在 Google Chrome 中)会突出显示第一段,而
http://server/#%25
会突出显示第二段。 (有点出乎意料的是,
http://server/#%2525
也突出了第二个。)
p:target { background-color: yellow; }
<p id="%">Buy today</p>
<p id="%25">and get 25% off!</p>
<a href="#%">http://server/#%</a>
<a href="#%25">http://server/#%25</a>
<a href="#%2525">http://server/#%2525</a>
这种行为正确吗?我喜欢它,但它似乎与
RFC 3986中的声明相矛盾:
由于百分号 (“%”) 字符用作百分比编码八位字节的指示符,因此必须将其百分比编码为“%25”,该八位字节才能用作 URI 中的数据。
%
、
?
和
&
这样的保留字符没有特殊含义,并且通常不需要在 URL 片段中对它们进行百分比编码。这意味着
#%
和
#%25
在 URL 片段中都是允许的,并且被视为不相等。RFC 3986 中的声明指出,当用作 URI 中的数据(例如在路径或查询组件中)时,百分比字符
%
本身必须进行百分比编码为
%25
,以避免与百分比编码机制混淆。但是,在片段组件中,
%
字符可以在不进行百分比编码的情况下使用,因为它没有特殊含义。因此,您观察到的行为与 URL 片段的处理一致,并且与 RFC 3986 并不矛盾。片段标识符可以包含保留字符,例如
%
,而不需要百分比编码。