Я кодирую амперсанды в <a href...>?
Я пишу код, который автоматически генерирует HTML, и я хочу, чтобы он правильно закодировал вещи.
Скажем, я создаю ссылку на следующий URL-адрес:
http://www.google.com/search?rls=en&q=stack+overflow
Я предполагаю, что все значения атрибутов должны быть закодированы в HTML. (Пожалуйста, исправьте меня, если я ошибаюсь.) Таким образом, если я помещаю вышеуказанный URL в якорный тег, я должен кодировать амперсанд как &
, например:
<a href="#" onclick="location.href='http://www.google.com/search?rls=en&q=stack+overflow'; return false;">
Правильно ли это?
Ответы
Ответ 1
Да, это так. Объекты HTML анализируются внутри HTML-атрибутов, а бродяга &
создает неоднозначность. Вот почему вы всегда должны писать &
вместо &
внутри всех атрибутов 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 амперсанд должен быть экранирован, например. как &
в таких контекстах. Однако браузеры этого не требуют, и HTML5 CR предлагает сделать это правило, так что в значениях атрибутов применяются специальные правила. Текущие валидаторы HTML5 устарели в этом отношении (см. отчет об ошибках с комментариями).
Остается возможность избежать амперсандов в значениях атрибутов, но помимо проверки с помощью текущих инструментов нет практической необходимости избегать их в значениях href
(и существует небольшой риск совершения ошибок, если вы начнете их избегать).
Ответ 3
Да, вы должны преобразовать &
в &
.
Этот инструмент проверки html с помощью W3C полезен для таких вопросов. Он расскажет вам об ошибках и предупреждениях для конкретной страницы.
Ответ 4
Да, это правильно.