Znak ucieczki ampersand w URL

203

Próbuję wysłać wiadomość GET, która zawiera ciągi ze znakami ampersand i nie mogę zrozumieć, jak uciec znak ampersand w adresie URL.

Przykład:

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

Próbowałem też:

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

Używam adresów URL ręcznie, więc potrzebuję tylko poprawnych znaków.

Nie mogę korzystać z żadnych bibliotek. Jak można to zrobić?

tomermes
źródło

Odpowiedzi:

350

Muszą być zakodowane procentowo:

> encodeURIComponent('&')
"%26"

W twoim przypadku adres URL mógłby wyglądać następująco:

http://www.mysite.com?candy_name=M%26M
Mikser
źródło
2
: -% 26 nie działa dla mnie. Czy jest jakieś inne rozwiązanie?
Sanjiv
2
Kiedy zamieniam & na% 26, nadal wyświetla ten sam błądA potentially dangerous Request.Path value was detected from the client (&).
Sanjiv
4
@Sanjiv: To jest problem z twoim kodem, a nie kodowaniem procentowym. Zadać pytanie.
Blender
2
@Sanjiv najpierw zamień „&” na „% 26”. Zobacz kod ::: NSString * message = @ "Hello Jack & Jill"; message = [wiadomość stringByReplacingOccurrencesOfString: @ "&" withString: @ "% 26"]; message = [message stringByAppendingString: @ ""]; message = [wiadomość stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
Nirav
40

Dotyczy to nie tylko ampersand w adresach URL, ale wszystkich znaków zastrzeżonych . Niektóre z nich obejmują:

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

Pomysł jest taki sam jak kodowanie & w dokumencie HTML, ale kontekst został zmieniony tak, aby zawierał się w URI, oprócz bycia w dokumencie HTML. Tak więc kodowanie procentowe zapobiega problemom z analizą składni w obu kontekstach.

Przydaje się to bardzo często, gdy trzeba umieścić adres URL w innym adresie URL. Na przykład, jeśli chcesz opublikować status na Twitterze:

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

W moim tweecie jest wiele zarezerwowanych znaków, a ?'():/więc zakodowałem całą wartość statusparametru URL. Jest to również pomocne, gdy używasz mailto:linków zawierających treść lub temat wiadomości, ponieważ musisz zakodować parametry bodyi subject, aby zachować nienaruszone podziały wierszy, znaki ampersand itp.

Gdy znak z zestawu zastrzeżonego („znak zastrzeżony”) ma specjalne znaczenie („zarezerwowany cel”) w pewnym kontekście, a schemat URI mówi, że konieczne jest użycie tego znaku w innym celu, wówczas znak musi być zakodowany procentowo. Kodowanie procentowe znaku zarezerwowanego obejmuje konwersję znaku na odpowiadającą mu wartość bajtu w ASCII, a następnie reprezentowanie tej wartości jako pary cyfr szesnastkowych. Cyfry poprzedzone znakiem procentu („%”), który jest używany jako znak zmiany znaczenia, są następnie używane w URI zamiast znaku zarezerwowanego. (W przypadku znaku spoza ASCII jest on zazwyczaj konwertowany na sekwencję bajtów w UTF-8, a następnie każda wartość bajtu jest reprezentowana jak powyżej.) Znak zastrzeżony „/”, na przykład, jeśli jest używany w „ścieżce” składnik identyfikatora URI ma specjalne znaczenie jako ogranicznik między segmentami ścieżki. Jeśli zgodnie z danym schematem URI „/” musi znajdować się w segmencie ścieżki, wówczas w segmencie należy użyć trzech znaków „% 2F” lub „% 2f” zamiast surowego „/”.

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

Alex W.
źródło
4
Wśród powyższej listy ! ' ( ) *nie są kodowane za pomocą adresu URL encodeURIComponent.
Amil Waduwawara
istnieje funkcja php urlencode, która rozwiązuje ten problem: użycie $ escapedfilename = urlencode ($ filename);
Jeremy Young
3

Możesz użyć znaku%, aby „uciec” ze znaków niedozwolonych w adresach URL. Zobacz [RFC 1738].

Tabela wartości ASCII na stronie http://www.asciitable.com/ .

Widać &26 w systemie szesnastkowym - więc potrzebujesz M% 26M.

Peter Hull
źródło
2

Może to pomóc, jeśli ktoś chce tego w PHP

$variable ="candy_name=M&M";
$variable = str_replace("&", "%26", $variable);
Mohamed Ramadan
źródło
1

Chciałbym dodać niewielki komentarz na temat rozwiązania Blender.

Możesz wykonać następujące czynności:

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

To daje:

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

Wspaniałą rzeczą w tym jest to, że działa nie tylko dla każdego szczególnego charakteru.

Na przykład:

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

Wyjścia:

"http://example.com?candy_name=M%26M%3F%3E%3C"
Antonio
źródło
0

Możesz raczej przekazać swoje argumenty za pomocą tej funkcji encodeURIComponent, abyś nie musiał się martwić o podanie jakichkolwiek znaków specjalnych.

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
źródło