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

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

Например, на русской странице "Россия" 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<5 для идентификатора / имени, так как токен должен начинаться с [A-Za-z]. В настоящее время HTML5 утверждает, что вы можете использовать по крайней мере один из любых символов, кроме пробела (так что вам вообще не нужно кодировать), но Википедия - это не HTML5.

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

1 ответ

Решение

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

Другие вопросы по тегам