Уникаючи символу "амперсанд" у 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-адреси вручну, тому мені просто потрібні правильні символи.

Я не можу використовувати жодну бібліотеку. Як це можна зробити?

Відповіді:


350

Вони повинні бути закодовані у відсотках:

> encodeURIComponent('&')
"%26"

Отже, у вашому випадку URL виглядатиме так:

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

2
: -% 26 не працює для мене. Чи є якесь інше рішення?
Санжив

2
Коли я замінити & на% 26, його все ще показує той же error--A potentially dangerous Request.Path value was detected from the client (&).
Санджив

4
@Sanjiv: Це проблема з вашим кодом, а не відсоткове кодування. Задайте питання.
Блендер

2
@Sanjiv переконайтесь, що ви замінили спочатку "&" на "% 26". Дивіться код ::: NSString * message = @ "Hello Jack & Jill"; message = [message stringByReplacingOccurrencesOfString: @ "&" withString: @ "% 26"]; message = [повідомлення stringByAppendingString: @ ""]; 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, а потім подання цього значення у вигляді пари шістнадцяткових цифр. Цифри, що передують знаку відсотка ("%"), який використовується як символ евакуації, потім використовуються в URI замість зарезервованого символу. (Для символу, який не є ASCII, він зазвичай перетворюється на його послідовність байтів у UTF-8, і тоді кожне байтне значення подається як вище.) Зарезервований символ "/", наприклад, якщо він використовується у "шляху" компонент URI, має особливе значення бути роздільником між сегментами шляху. Якщо відповідно до заданої схеми URI, "/" має бути в сегменті шляху, тоді три символи "% 2F" або "% 2f" повинні бути використані в сегменті замість необробленого "/".

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


4
Серед наведеного вище списку ! ' ( ) *не використовуються кодовані URL-адреси encodeURIComponent.
Аміл Вадувавара

є функція php urlencode, яка вирішує цю проблему: використання $ escapedfilename = urlencode ($ filename);
Джеремі Янг


3

Ви можете використовувати символ% для "втечі" символів, які не дозволені в URL-адресах. Див. [RFC 1738].

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

Ви можете бачити, що &це 26 у шістнадцятковій формі - значить, вам потрібно M% 26M.




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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.