为什么维基百科在其URL片段中使用修改后的百分比编码?

Dee*_*ter 8 url fragment-identifier url-design percent-encoding

我注意到Wikipedia使用百分比编码作为URL的路径部分,但将%字符转换.为#fragment.

例如,在俄罗斯的"俄罗斯"页面上,第2部分(История)的URL 是

http://ru.wikipedia.org/wiki/%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F#.D0.98.D1.81.D1.82.D0.BE.D1.80.D0.B8.D1.8F

代替

http://ru.wikipedia.org/wiki/%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F#%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F

对于id/name,两者都不是有效的HTML <5令牌,因为令牌必须以[A-Za-z]开头.HTML5 目前声明您可以使用除空格之外的任何字符中的至少一个(因此您根本不需要编码),但维基百科不是HTML5.

那么,为什么维基百科使用这个方案呢?

Dee*_*ter 5

一个可能的答案是跨浏览器问题.浏览器处理unicode的方式不一致,尤其是URL片段.

例如,链接

<a id="foo" href="%D1%83%D0%BE%D0%BC%D0%B1%D0%BB%D1%8B">??????</a>

Browser      | Hover   | Location bar | href*   | path*
----------------------------------------------------------
Chrome 19    | Unicode | Unicode      | Percent | Percent
Firefox 13   | Unicode | Unicode      | Percent | Percent
IE 9         | Percent | Percent      | Percent | Percent
Run Code Online (Sandbox Code Playgroud)

但是有一个片段:

<a id="foo" href="#%D1%83%D0%BE%D0%BC%D0%B1%D0%BB%D1%8B">??????</a>

Browser      | Hover   | Location bar | href*   | hash*
----------------------------------------------------------
Chrome 19    | Percent | Percent      | Percent | Percent
Firefox 13   | Unicode | Unicode      | Percent | Unicode
IE 9         | Percent | Percent      | Percent | Percent
Run Code Online (Sandbox Code Playgroud)

href = javascript:document.getElementById('foo').href

path = javascript:location.pathname以下链接后

hash = javascript:location.hash在以下链接之后

因此,当您要求散列时,Firefox会将片段的百分比编码解码为unicode,从而导致它与id/name属性的值不匹配.注意,这只是JavaScript中的一个问题; 以下链接工作正常.