XHTML и & (Ampersand) кодирование - PullRequest
35 голосов
/ 08 ноября 2008

Мой веб-сайт поддерживает XHTML Transitional , за исключением одной вещи : символ & (амперсанд) в URL записывается как есть, а не &

То есть все URL на моих страницах обычно такие:

<a href="http://www.foo.com/page.aspx?x=1&y=2">Foo</a>

Но Валидатор XHTML генерирует эту ошибку:

не может сгенерировать системный идентификатор для общего объекта "y"

... и он хочет, чтобы URL был написан так:

<a href="http://www.foo.com/page.aspx?x=1&amp;y=2">Foo</a>

Проблема в том, что IE и Firefox неправильно обрабатывают URL-адрес и игнорируют параметр y. Как я могу заставить эту ссылку работать и правильно проверять?

Мне кажется, что невозможно писать страницы XHTML, если браузеры не работают со строго закодированными URL-адресами XHTML.

Хотите увидеть в действии? Посмотрите на разницу между этими двумя ссылками (скопируйте и вставьте их как есть):

http://stackoverflow.com/search?q=ff&sort=newest

и

http://stackoverflow.com/search?q=ff&amp;sort=newest

Ответы [ 5 ]

56 голосов
/ 09 ноября 2008

Я только что попробовал это. То, что вы пытались сделать, правильно. В HTML, если вы пишете ссылку, символы & должны быть закодированы как &amp;. Кодирование & будет только %26, если вы хотите, чтобы значение параметра содержало амперсанд. Я только что написал простую страницу HTML, которая содержала ссылку: <a href="Default2.aspx?param1=63&amp;param2=hel">Click me</a> и он работал нормально: default2.aspx получил заданные параметры, а источник прошел проверку.

Кодировка & как &amp; требуется в HTML, а не в ссылке. Когда браузер видит ссылку &amp; в источнике HTML для ссылки, он интерпретирует ее как амперсанд, и цель ссылки будет соответствовать назначению. Если вы вставляете URL в адресную строку браузера, он не ожидает, что это будет HTML, и не пытается интерпретировать какую-либо кодировку HTML, которая может в нем содержаться. Вот почему ваши примеры ссылок, которые вы предлагаете нам скопировать / вставить в браузер, не работают, и поэтому мы не ожидаем, что они будут работать.

Если вы разместите немного больше своего действительного кода, мы сможем увидеть, что вы сделали неправильно, но вы, кажется, движетесь в правильном направлении, используя &amp; в своих тегах привязки.

6 голосов
/ 09 ноября 2008

Это была моя ошибка: элемент управления Hyperlink уже закодирован &, поэтому мой URL http://foo?x=1&amp;y=2 был закодирован в http://foo?x=1&amp;amp;y=2

Как правило, браузер правильно обрабатывает & amp внутри URL, как вы указали. Спасибо

5 голосов
/ 08 ноября 2008

вы можете использовать &amp; вместо & в вашем URL на вашей странице.

Это должно позволить ему быть проверенным строгим XHTML ...

<a href="http://www.foo.com/page.aspx?x=1&amp;y=2">Foo</a>

Обратите внимание, что при использовании функции ASP.NET Request.QueryString строка запроса не использует XML-кодировку, она использует URL-кодировку :

/mypath/mypage?b=%26stuff

Так что вам нужно предоставить функцию, переводящую '&' в% 26

Примечание: в этом случае Server.URLEncode (”neetu & geetu”), который выдает neetu +% 26 + geetu, - это не то, что вам нужно, поскольку вам нужно перевести & на% 26, а не просто '&' , Вы должны добавить вызов replace (), примененный к результату URLEncode, чтобы заменить "% 26amp;" на "% 26".

0 голосов
/ 25 сентября 2014

Чтобы быть еще более тщательным: используйте &#38;, числовую ссылку на символ .

Поскольку &amp; является символьной ссылкой на сущность :

Ссылки на символьные объекты определены на языке разметки определение. Это означает, например, что для HTML только определенный диапазон символов (определенный спецификацией HTML) может быть представлены в виде ссылок на символьную сущность (и включает в себя только небольшое подмножество диапазона Unicode).

Это исходит от мудрых людей из W3C (подробнее читайте это ).

Конечно, это не так уж и сложно, но W3C предлагает, чтобы числовой код был действительным и пригодным для использования везде и всегда, в то время как именованный вариант подходит для HTML, но не более того.

0 голосов
/ 11 ноября 2008

Проблема хуже, чем вы думаете - попробуйте в Safari. & Амп; конвертируется в & и хеш завершает URL. Правильный ответ - не выводить XHTML - нет причины, которая оправдывает тратить больше времени на разработку и отчуждение пользователей Mac.

...