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이 작동하지 않습니다. 다른 해결책이 있습니까?
Sanjiv

2
&를 % 26으로 바꾸면 여전히 같은 오류가 나타납니다.A potentially dangerous Request.Path value was detected from the client (&).
Sanjiv

4
@ Sanjiv : 백분율 인코딩이 아닌 코드에 문제가 있습니다. 질문하십시오.
Blender

2
@Sanjiv는 먼저 "&"를 "% 26"으로 바꾸십시오. 코드 참조 ::: NSString * message = @ "Hello Jack & Jill"; message = [메시지 stringByReplacingOccurrencesOfString : @ "&"withString : @ "% 26"]; message = [메시지 문자열 ByAppendingString : @ ""]; message = [메시지 문자열 ByAddingPercentEscapesUsingEncoding : NSUTF8StringEncoding];
Nirav

40

이것은 앰퍼샌드 URL뿐만 아니라 예약 된 모든 문자 에도 적용 됩니다 . 그 중 일부는 다음과 같습니다.

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

아이디어는 &HTML 문서에서 인코딩과 동일 하지만 컨텍스트는 HTML 문서 내에있는 것 외에도 URI 내에 있도록 변경되었습니다. 따라서 퍼센트 인코딩은 두 컨텍스트 내에서 구문 분석하는 문제를 방지합니다.

이것이 매우 유용한 곳은 다른 URL 안에 URL을 넣어야 할 때입니다. 예를 들어 Twitter에 상태를 게시하려는 경우 :

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

내 트윗에는 예약 문자가 많으 ?'():/므로 statusURL 매개 변수 의 전체 값을 인코딩했습니다 . 또한 줄 바꿈, 앰퍼샌드 등을 그대로 유지 mailto:하려면 bodysubject매개 변수를 인코딩해야하므로 메시지 본문이나 제목이있는 링크를 사용할 때 유용 합니다.

예약 된 세트 ( "예약 된 문자")의 문자가 특정 컨텍스트에서 특별한 의미 ( "예약 된 목적")를 가지고 있고 URI 체계가 해당 문자를 다른 목적으로 사용해야한다고 말하는 경우 퍼센트로 인코딩되어야합니다. 예약 문자의 퍼센트 인코딩은 문자를 ASCII의 해당 바이트 값으로 변환 한 다음 해당 값을 16 진수 쌍으로 표시합니다. 이스케이프 문자로 사용되는 퍼센트 부호 ( "%")가 앞에 오는 숫자는 예약 문자 대신 URI에서 사용됩니다. 비 ASCII 문자의 경우 일반적으로 UTF-8의 바이트 시퀀스로 변환 된 다음 각 바이트 값이 위와 같이 표시됩니다. 예를 들어 "path"에 사용되는 예약 문자 "/" URI의 구성 요소는 경로 세그먼트 사이의 구분 기호라는 특별한 의미가 있습니다. 지정된 URI 체계에 따라 "/"가 경로 세그먼트에 있어야하는 경우 원시 "/"대신 세 문자 "% 2F"또는 "% 2f"를 세그먼트에 사용해야합니다.

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


4
위 목록 중을 ! ' ( ) *사용하여 URL로 인코딩하지 않았습니다 encodeURIComponent.
Amil Waduwawara

이 문제를 해결하는 PHP 기능 urlencode가 있습니다. 사용법 $ escapedfilename = urlencode ($ filename);
Jeremy Young


3

% 문자를 사용하여 URL에서 허용되지 않는 문자를 '이스케이프'할 수 있습니다. [RFC 1738]을 참조하십시오.

http://www.asciitable.com/ 의 ASCII 값 표 .

당신이 볼 수는 &16 진수로 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"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.