Почему Википедию использовать модифицированный процентов кодировки в их фрагментов URL-адрес?


Я заметил, что Википедия использует процентное кодирование для раздела пути URL, но преобразует символ % в . для фрагмента#.

Например, на страницеRussian "Россия" URL-адрес раздела 2 (История)

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

Также не являются допустимыми HTML в настоящее время утверждает , что вы можете использовать по крайней мере один из любых символов помимо пространства (так что вам не нужно кодировать вообще), но Википедия-это не HTML5.

Итак, почему Википедия использовала эту схему?

1 8

1 ответ:

Один из возможных ответов - кроссбраузерные проблемы. Браузеры непоследовательны в том, как они обрабатывают 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

Но с фрагментом:

<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

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

Путь = javascript:location.pathname после следующей ссылки

Хэш = javascript:location.hash после перехода по ссылке

Поэтому Firefox будет декодировать процентное кодирование фрагмента в unicode, когда вы попросите хэш, в результате чего он не будет соответствует значению атрибута id/name. Обратите внимание, что это только проблема в JavaScript; следующие ссылки работают нормально.