Подтвердить что ты не робот

Нужно ли амперсанды кодироваться в URL-адресах в HTML5?

Недавно я узнал (из , что в какой-то момент было целесообразно кодировать амперсанды в Параметры href. То есть вместо написания:

<a href="somepage.html?x=1&y=2">...</a>

Следует написать:

<a href="somepage.html?x=1&amp;y=2">...</a>

По-видимому, предыдущий пример не должен работать, но восстановление ошибок в браузере означает, что он делает.

Это все еще имеет место в HTML5?

Мы сейчас прошли эпоху драконовских требований XHTML. Было ли это требованием к строгому управлению XHTML, или это действительно все еще то, что я должен знать как веб-разработчик?

4b9b3361

Ответ 1

Верно, что одно из различий между HTML5 и HTML4, приведенное на странице W3C Differences, выглядит следующим образом:

Амперсанд (&) может быть оставлен без привязки в большем числе случаев по сравнению с HTML4.

Фактически, спецификация HTML5 имеет большое значение, описывая фактические алгоритмы, которые определяют, что означает употребление (и интерпретация) символов.

В частности, в разделе о символических ссылках из главы 8 в спецификации HTML5 мы видим, что когда вы находитесь внутри атрибута и видите амперсанд за которым следует:

  • вкладка, LF, FF, пробел, <, &, EOF или дополнительный разрешенный символ (a " или ', если значение атрибута указано или > если нет) === > , тогда амперсанд просто амперсанд, не беспокойтесь;
  • знак числа === > , то токенизатор HTML5 будет проходить через множество шагов, чтобы определить, имеет ли он ссылку на числовой символ или нет, но обратите внимание, что в этом случае вы подвергаетесь ошибкам разбора (читайте спецификацию)
  • любой другой символ === > анализатор попытается найти ссылку на именованный символ, например, что-то вроде &notin;.

Последний случай представляет интерес для вас, так как ваш пример:

<a href="somepage.html?x=1&y=2">...</a>

У вас есть последовательность символов

  • Ampersand
  • ЛАТИНСКОЕ МАЛОЕ ПИСЬМО Y
  • EQUAL SIGN

Теперь вот часть спецификации HTML5, которая имеет значение в вашем случае, потому что y не является ссылкой на именованный объект:

Если совпадение не может быть выполнено, никакие символы не будут уничтожены, и ничего не будет возвращено. В этом случае, если символы после символа U + 0026 AMPERSAND (&) состоят из последовательности одного или нескольких буквенно-цифровых символов ASCII, за которыми следует символ U + 003B SEMICOLON (;), то это ошибка синтаксического анализа.

У вас нет точки с запятой, поэтому у вас нет ошибки синтаксического анализа.

Теперь предположим, что вместо этого вы использовали

<a href="somepage.html?x=1&eacute=2">...</a>

который отличается от того, что &eacute; является ссылкой на именованный объект в HTML. В этом случае выполняется следующее правило:

Если ссылка символа потребляется как часть атрибута, а последний совпадающий символ не является ";" (U + 003B), а следующий символ либо является символом "=" (U + 003D), либо буквенно-цифровым символом ASCII, а затем по историческим причинам все символы, которые были сопоставлены после символа AM + PLAR U + 0026 (&) должен быть нерассмотренным, и ничего не возвращается. Однако, если этот следующий символ на самом деле является символом "=" (U + 003D), то это ошибка синтаксического анализа, потому что некоторые устаревшие пользовательские агенты неправильно интерпретируют разметку в этих случаях.

Итак, = делает ошибку, потому что устаревшие браузеры могут запутаться.

Несмотря на то, что спецификация HTML5, по-видимому, подходит к большой длине, чтобы сказать "хорошо, что этот амперсанд не запускает ссылку на объект символа, поэтому здесь нет ссылки" на то, что вы можете столкнуться с URL-адресами, которые назвали ссылки (например, isin, part, sum, sub), что приведет к ошибкам синтаксического анализа, а затем имхо лучше с ними. Но, конечно, вы только спрашивали, смягчены ли ограничения в атрибутах, а не то, что вы должны делать, и кажется, что они были.

Было бы интересно посмотреть, что делают валидаторы.