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ć?

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

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


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



2

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

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


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"

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.