Почему Википедия использует измененную процентную кодировку в своих фрагментах 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; по ссылкам работает нормально.