Кодировать ли амперсанды в ? - PullRequest
       22

Кодировать ли амперсанды в ?

153 голосов
/ 14 сентября 2010

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

Допустим, я генерирую ссылку на следующий URL:

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

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

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

Isэто правильно?

Ответы [ 4 ]

170 голосов
/ 14 сентября 2010

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

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

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

24 голосов
/ 09 мая 2013

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

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

3 голосов
/ 28 декабря 2018

Я публикую новый ответ, потому что обнаружил, что в ответе zneak недостаточно примеров, он не показывает обработку HTML и URI как различные аспекты и стандарты, а некоторые мелочи отсутствуют.

У вас есть два стандарта в отношении URL в ссылках (<a href).

Первый стандарт: RFC 1866 (HTML 2.0), где в «3.2.1. Символы данных» вы можете прочитать символы, которые необходимо экранировать при использовании в качестве значения для атрибута HTML. (Сами атрибуты вообще не допускают использование специальных символов, например, <a hr&ef="http://... не допускается и <a hr&amp;ef="http://....)

Позже это вошло в стандарт HTML 4 , символы, которые вы должны экранировать:

<   to   &lt;
>   to   &gt;
&   to   &amp;
"   to   &quote;
'   to   &apos;

Другой стандарт - RFC 3986 «Общий стандарт URI», где обрабатываются URL-адреса (это происходит, когда браузер собирается перейти по ссылке, потому что пользователь нажал на HTML элемент).

reserved    = gen-delims / sub-delims

gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

Важно избегать этих символов, чтобы клиент знал, представляют ли они данные или разделитель.

Пример unescaped:

https://example.com/?user=test&password&te&st&goto=https://google.com

Пример, полностью допустимый URL

https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com

Пример полностью допустимого URL-адреса в значении атрибута HTML:

https://example.com/?user=test&amp;password&amp;te%26st&amp;goto=https%3A%2F%2Fgoogle.com

Также важны сценарии:

3 голосов
/ 28 апреля 2015

Да, вам следует преобразовать & в &amp;.

Этот инструмент проверки html от W3C полезен для подобных вопросов.Он расскажет вам об ошибках и предупреждениях для конкретной страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...