Я кодирую амперсанды в <a href...>?

Я пишу код, который автоматически генерирует HTML, и я хочу, чтобы он правильно закодировал вещи.

Скажем, я создаю ссылку на следующий URL-адрес:

http://www.google.com/search?rls=en&q=stack+overflow

Я предполагаю, что все значения атрибутов должны быть закодированы в HTML. (Пожалуйста, исправьте меня, если я ошибаюсь.) Таким образом, если я помещаю вышеуказанный URL в якорный тег, я должен кодировать амперсанд как &amp;, например:

<a href="#" onclick="location.href='http://www.google.com/search?rls=en&amp;q=stack+overflow'; return false;">

Правильно ли это?

Ответ 1

Да, это так. Объекты HTML анализируются внутри HTML-атрибутов, а бродяга & создает неоднозначность. Вот почему вы всегда должны писать &amp; вместо & внутри всех атрибутов HTML.

Тем не менее, только & и кавычки должны быть закодированы. Если в вашем атрибуте есть специальные символы, такие как é, вам не нужно кодировать их, чтобы удовлетворить синтаксический анализатор HTML.

Раньше было, что URL-адреса нуждались в специальной обработке с символами, отличными от ASCII, например é. Вам пришлось кодировать те, которые используют процентные escape-последовательности, и в этом случае он дал бы %C3%A9, потому что они были определены RFC 1738. Однако RFC 1738 был заменен RFC 3986 (URI, унифицированные идентификаторы ресурсов) и RFC 3987 (IRI, интернационализированные идентификаторы ресурсов), на которых WhatWG основывает свою работу на определении того, как браузеры должны вести себя, когда они видят URL-адрес с не-ASCII-символы, начиная с HTML5. Поэтому теперь безопасно включать символы, отличные от ASCII, в URL-адресах, в процентах или без.

Ответ 2

В соответствии с текущими официальными рекомендациями HTML амперсанд должен быть экранирован, например. как &amp; в таких контекстах. Однако браузеры этого не требуют, и HTML5 CR предлагает сделать это правило, так что в значениях атрибутов применяются специальные правила. Текущие валидаторы HTML5 устарели в этом отношении (см. отчет об ошибках с комментариями).

Остается возможность избежать амперсандов в значениях атрибутов, но помимо проверки с помощью текущих инструментов нет практической необходимости избегать их в значениях href (и существует небольшой риск совершения ошибок, если вы начнете их избегать).

Ответ 4

Да, это правильно.