[urlencode] 공백을 플러스 (+) 또는 % 20으로 인코딩 할 때?

때로는 공백이 +부호로 URL 인코딩되고 다른 시간은로 인코딩 됩니다 %20. 차이점은 무엇이며 왜 이런 일이 발생해야합니까?



답변

+공간을 의미 application/x-www-form-urlencoded같은 URL의 쿼리 부분 등의 내용을 :

http://www.example.com/path/foo+bar/path?query+name=query+value

이 URL에서, 매개 변수 이름은 query name공백으로하고, 값은 query value공백으로하지만, 경로에있는 폴더 이름은 문자 그대로 foo+bar, 없습니다 foo bar .

%20이 컨텍스트 중 하나에서 공백을 인코딩하는 올바른 방법입니다. 당신이 URL의 일부 URL 인코딩에 포함시킬 문자열을 필요 그래서 경우에 공백을 대체하기 위해 항상 안전 %20과 및 흑자를 %2B. 이것은 예입니다. encodeURIComponent()JavaScript에서 않습니다. 불행히도 PHP에서 urlencode 가하는 것이 아닙니다 ( rawurlencode 가 더 안전합니다).

참조 또한
HTML 4.01 사양 응용 프로그램 / x-www-form-urlencoded를


답변

http://www.example.com/some/path/to/resource?param1=value1

물음표 앞의 부분은 % 인코딩 ( %20공백의 경우)을 사용해야하며 %20, 물음표 다음 +에 공백을 사용할 수 있습니다 . 실제 +물음표 가 필요한 경우를 사용하십시오 %2B.


답변

따라서 여기의 답변은 모두 불완전합니다. URL에서 공백을 인코딩하기 위해 ‘% 20’을 사용하는 것은 RFC3986에 명시 적으로 정의되어 있으며 URI는 작성 방법을 정의합니다. 이 사양에서는 공간 인코딩에 ‘+’를 사용하는 것에 대한 언급이 없습니다.이 사양만으로 이동하는 경우 공백은 ‘% 20’으로 인코딩해야합니다.

공백을 인코딩하는 데 ‘+’를 사용하는 것에 대한 언급은 HTML 사양의 다양한 화신, 특히 콘텐츠 유형 ‘application / x-www-form-urlencoded’를 설명하는 섹션에서 나옵니다. 양식 데이터를 게시하는 데 사용됩니다.

이제 HTML 2.0 사양 (RFC1866) 은 섹션 8.2.2에서 GET 요청 URL 문자열의 쿼리 부분을 ‘application / x-www-form-urlencoded’로 인코딩해야한다고 명시 적으로 말했습니다. 이론적으로 이것은 쿼리 문자열의 URL에서 ‘?’다음에 ‘+’를 사용하는 것이 합법적이라고 제안합니다.

하지만 … 정말 그렇습니까? HTML 자체는 내용 사양이며 쿼리 문자열이있는 URL은 HTML 이외의 내용과 함께 사용할 수 있습니다. 또한 최신 버전의 HTML 사양에서는 ‘application / x-www-form-urlencoded’콘텐츠에서 ‘+’를 유효한 것으로 계속 정의하지만 GET 요청 쿼리 문자열이 해당 유형으로 정의되어 있다고 말하는 부분을 완전히 생략합니다. 실제로 HTML 2.0 스펙 이후의 쿼리 문자열 인코딩에 대한 언급은 없습니다.

어느 것이 우리에게 질문을 남겼습니까? 확실히 쿼리 문자열에서 ‘+’를 지원하는 많은 레거시 코드와 코드를 생성하는 많은 코드가 있습니다. ‘+’를 사용하면 깨지지 않을 확률이 높습니다. (실제로, 나는 최근에 GET 쿼리에서 ‘% 20’을 공백으로 받아들이지 못하는 주요 사이트를 발견했기 때문에 최근에 모든 연구를 수행했습니다. 실제로 모든 퍼센트 인코딩 된 문자를 디코딩하지 못했습니다. ‘사용하는 것도 관련이있을 수 있습니다.)

그러나 HTML 2.0 사양의 언어를 사용하지 않고 사양을 완전히 읽었을 때 URL은 RFC3986으로 완전히 커버되므로 공백은 ‘% 20’으로 변환되어야합니다. HTML 문서 이외의 다른 것을 요청하는 경우에는 반드시 그렇습니다.


답변

항상 공백을 “+”가 아닌 % 20으로 인코딩하는 것이 좋습니다.

RFC-1866 (HTML 2.0 사양)으로, “application / x-www-form-urlencoded”컨텐츠 유형 키-값 쌍에서 공백 문자를 “+”로 인코딩하도록 지정했습니다. (문단 8.2.1. 하위 단락 1 참조). 이 방식으로 양식 데이터를 인코딩하는 방법은 이후의 HTML 사양에도 나와 있습니다. application / x-www-form-urlencoded에 대한 관련 단락을 찾으십시오.

다음은 RFC-1866에서 “http://example.com/over/there?name=foo+bar”와 같이 인코딩 공백을 허용하는 URL의 문자열 예입니다. 따라서 RFC-1866에 따르면 “?”뒤에 만 공백을 플러스로 바꿀 수 있습니다. 다른 경우에는 공백이 % 20으로 인코딩되어야합니다. 그러나 컨텍스트를 결정하기가 어렵 기 때문에 공백을 “+”로 인코딩하지 않는 것이 가장 좋습니다.

RFC-3986, p.2.3에 정의 된 “예약되지 않은”을 제외한 모든 문자를 백분율로 인코딩하는 것이 좋습니다.

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"


답변

차이점 : 다른 답변보기.

사용하는 경우 +대신 %20? 사용 +어떤 이유로, 당신은 URL 쿼리 문자열 (수 있도록하려는 경우에 ?.....) 또는 해시 조각 ( #....) 더 읽기를. 예 : 실제로 이것을 읽을 수 있습니다 :

https://www.google.se/#q=google+doesn%27t+encode+:+and+uses+%2B+instead+of+spaces
( %2B= +)

그러나 다음은 읽기가 훨씬 어렵습니다. (적어도 나에게는)

https://www.google.se/#q=google%20doesn%27t%20oops%20:%20%20this%20text%20%2B%20is%20different%20spaces

+Google이 사용하기 때문에 +(위의 첫 번째 링크 참조) 아마도 이것에 대해 생각한 이후로 아무것도 깨뜨리지 않을 것이라고 생각 합니다. +읽을 수있는 + Google이 괜찮다고 생각하기 때문에 스스로 사용하려고합니다 .


답변