Выход из амперсанда в URL

Я пытаюсь отправить сообщение GET, содержащее строки с амперсандами и не могу понять, как экранировать амперсанд в URL-адресе.

Пример:

http://www.example.com?candy_name=M&M
result => candy_name = M

Я также попробовал:

http://www.example.com?candy_name=M\&M
result => candy_name = M\\

Я использую URL-адреса вручную, поэтому мне просто нужны правильные символы.

Я не могу использовать любые библиотеки. Как это можно сделать?

Ответ 1

Они должны быть закодированы в процентах:

> encodeURIComponent('&')
"%26"

Итак, в вашем случае URL-адрес будет выглядеть так:

http://www.mysite.com?candy_name=M%26M

Ответ 2

Это относится не только к амперсанду в URL-адресах, но ко всем зарезервированным символам. Некоторые из них включают:

 # $ & + ,  / : ; = ? @ [ ]

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

Место, где это очень удобно, - это когда вам нужно поместить URL-адрес внутри другого URL-адреса. Например, если вы хотите опубликовать статус в Twitter:

http://www.twitter.com/intent/tweet?status=What%27s%20up%2C%20StackOverflow%3F(http%3A%2F%2Fwww.stackoverflow.com)

В моем Tweet есть много зарезервированных символов, а именно ?'():/, поэтому я закодировал все значение параметра status URL. Это также полезно при использовании ссылок mailto:, у которых есть тело сообщения или субъект, потому что вам нужно кодировать параметры body и subject, чтобы сохранить целостность строк, амперсандов и т.д.

Когда символ из зарезервированного набора ( "зарезервированный символ" ) особый смысл ( "зарезервированная цель" ) в определенном контексте и URI схема говорит, что необходимо использовать этот символ для некоторого другого цели, то символ должен быть закодирован в процентах. Процент кодирования зарезервированный символ включает преобразование символа в его соответствующее значение байта в ASCII и затем представляющее это значение как пара шестнадцатеричных цифр. Цифры, которым предшествует знак процента ( "%" ), который используется как escape-символ, затем используются в URI вместо зарезервированного символа. (Для символа, отличного от ASCII, это обычно преобразуется в свою последовательность байтов в UTF-8, а затем каждый байт значение представлено, как указано выше.) Зарезервированный символ "/" , для например, если он используется в компоненте "путь" URI, имеет специальный смысл быть разделителем между сегментами пути. Если, согласно с учетом схемы URI, "/" должен находиться в сегменте пути, затем три символы "% 2F" или "% 2f" должны использоваться в сегменте вместо необработанного "/" .

http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

Ответ 3

Попробуйте использовать http://www.example.org?candy_name=M%26M.

См. также эту ссылку и дополнительную информацию в Википедии.

Ответ 4

Вы можете использовать символ% для "экранирования" символов, которые не разрешены в URL. См. [RFC1738].

Таблица значений ASCII на http://www.asciitable.com/.

Вы можете видеть, что & равен 26 в шестнадцатеричном формате, поэтому вам нужно M% 26M.

Ответ 5

Это может помочь, если кто-то хочет это в PHP

$variable ="candy_name=M&M";
$variable = str_replace("&", "%26", $variable);

Ответ 6

Если вы не можете использовать какие-либо библиотеки для кодирования значения, http://www.urlencoder.org/ или http://www.urlencode-urldecode.com/ или...

Просто введите значение "M & M", а не полный URL ;-)

Ответ 7

Вы можете передать свои аргументы с помощью этой функции encodeURIComponent, чтобы вам не пришлось беспокоиться о передаче каких-либо специальных символов.

data: "param1=getAccNos&param2="+encodeURIComponent('Dolce & Gabbana') OR
var someValue = 'Dolce & Gabbana';
data : "param1=getAccNos&param2="+encodeURIComponent(someValue)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent

Ответ 8

Я хотел бы добавить небольшой комментарий к решению Blender.

Вы можете сделать следующее:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M');

Это выводит:

http://example.com?candy_name=M%26M

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

Например:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M?><')

Выходы:

"http://example.com?candy_name=M%26M%3F%3E%3C"