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

203

Я пытаюсь отправить сообщение 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-адреса вручную, поэтому мне просто нужны правильные символы.

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

tomermes
источник

Ответы:

350

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

> encodeURIComponent('&')
"%26"

Так что в вашем случае URL будет выглядеть так:

http://www.mysite.com?candy_name=M%26M
смеситель
источник
2
: - 26% не работает для меня. Есть ли другое решение?
Санджив
2
Когда я заменяю & на% 26, он все еще показывает ту же ошибку--A potentially dangerous Request.Path value was detected from the client (&).
Sanjiv
4
@Sanjiv: Это проблема с вашим кодом, а не процентное кодирование. Задайте вопрос.
Блендер
2
@Sanjiv сначала убедитесь, что вы заменили "&" на "% 26". Смотрите код ::: NSString * message = @ "Привет, Джек и Джилл"; message = [message stringByReplacingOccurferencesOfString: @ "&" withString: @ "% 26"]; message = [message stringByAppendingString: @ ""]; message = [message stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
Нирав
40

Это относится не только к амперсанду в 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)

В моем твите много зарезервированных символов, а именно ?'():/, поэтому я закодировал все значение 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

Алекс W
источник
4
Среди приведенного выше списка, ! ' ( ) *не URL-адреса, закодированные с помощью encodeURIComponent.
Амил Вадувавара
есть функция php urlencode, которая решает эту проблему: use $ escapedfilename = urlencode ($ filename);
Джереми Янг
4

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

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

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

Питер Халл
источник
2

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

$variable ="candy_name=M&M";
$variable = str_replace("&", "%26", $variable);
Мохамед Рамадан
источник
1

Я хотел бы добавить небольшой комментарий к решению 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"
Антонио
источник
0

Вы можете скорее передать свои аргументы, используя эту функцию 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

nikhilmeth
источник