공백 문자를 인코딩하는 URL : + 또는 % 20?


답변:


425

에서 위키 백과 (강조 링크 추가)

HTML 양식에 입력 된 데이터가 제출되면 양식 필드 이름 및 값이 인코딩되어 GET 또는 POST 메소드를 사용하거나 HTTP를 통해 HTTP 요청 메시지로 서버에 전송됩니다. 기본적으로 사용되는 인코딩 은 줄 바꿈 정규화 및 공백을 "% 20"대신 "+"로 바꾸는 등 의 많은 수정 을 통해 일반 URI 퍼센트 인코딩 규칙의 초기 버전을 기반으로합니다 . 이러한 방식으로 인코딩 된 MIME 유형의 데이터는 application / x-www-form-urlencoded이며 현재 HTML 및 XForms 사양에 정의되어 있습니다.

따라서 URL의 양식 데이터는을 사용하는 수정 된 양식에있는 동안 실제 백분율 인코딩은 %20사용합니다 +. 따라서 +검색어 문자열의 URL 뒤에 만 표시 될 가능성이 큽니다 ?.


2
따라서 + 인코딩은 기술적으로 멀티 파트 / 폼 데이터 인코딩이되고 퍼센트 인코딩은 application / x-www-form-urlencoded입니까?
BC.

17
@BC : 아니오-MIME multipart/form-data인코딩을 사용합니다. application/x-www-form-urlencoded사용 +하고 올바르게 인코딩 된 URI 사용%20 합니다.
McDowell

8
"따라서 검색어 문자열의 URL에서 + 뒤에 + 만 표시 될 가능성이 가장 높습니다." 과소 평가입니다. URL의 경로 부분에는 "+"가 표시되지 않아야합니다. URL은 예상 한대로 (공백) 수행하지 않기 때문입니다.
Adam Gent

34
기본적으로 : GET 제출 대상은 http://www.bing.com/search?q=hello+world이름에 공백이있는 자원http://camera.phor.net/cameralife/folders/2012/2012-06%20Pool%20party/
William Entriken

8
이메일 링크의 경우? 뒤에 +가 아닌 % 20이 필요합니다. 예를 들면 다음과 같습니다 mailto:support@example.org?subject=I%20need%20help. +를 사용하여 시도한 경우 공백 대신 + es로 이메일이 열립니다.
Sygmoral

287

이 혼란은 오늘날까지 URL이 여전히 '파손'되었기 때문입니다.

예를 들어 " http://www.google.com "을 선택 하십시오 . 이것은 URL입니다. URL은 Uniform Resource Locator이며 실제로 웹 페이지에 대한 포인터입니다 (대부분의 경우). URL은 실제로 1994 년 첫 번째 사양 이후 매우 잘 정의 된 구조를 가지고 있습니다.

" http://www.google.com "URL 에 대한 자세한 정보를 추출 할 수 있습니다 .

+---------------+-------------------+
|      Part     |      Data         |
+---------------+-------------------+
|  Scheme       | http              |
|  Host         | www.google.com    |
+---------------+-------------------+

다음과 같은보다 복잡한 URL을 보면 :

" https : // bob : bobby@www.lunatech.com : 8080 / file; p = 1? q = 2 # third "

다음 정보를 추출 할 수 있습니다.

+-------------------+---------------------+
|        Part       |       Data          |
+-------------------+---------------------+
|  Scheme           | https               |
|  User             | bob                 |
|  Password         | bobby               |
|  Host             | www.lunatech.com    |
|  Port             | 8080                |
|  Path             | /file;p=1           |
|  Path parameter   | p=1                 |
|  Query            | q=2                 |
|  Fragment         | third               |
+-------------------+---------------------+

https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third
\___/   \_/ \___/ \______________/ \__/\_______/ \_/ \___/
  |      |    |          |          |      | \_/  |    |
Scheme User Password    Host       Port  Path |   | Fragment
        \_____________________________/       | Query
                       |               Path parameter
                   Authority

예약 된 문자는 각 부분마다 다릅니다.

HTTP URL의 경우 경로 조각 부분의 공백은 "% 20"( "+"아님)로 인코딩해야하지만 경로 조각 부분의 "+"문자는 인코딩되지 않은 채로 둘 수 있습니다.

이제 쿼리 부분에서 공백은 "+"(이전 버전과의 호환성을 위해 : URI 표준에서 검색하지 마십시오) 또는 "% 20"으로 인코딩 될 수 있지만 "+"문자 (이 모호함의 결과) )를 "% 2B"(으)로 이스케이프해야합니다.

이는 "파란색 + 하늘색"문자열이 경로 및 쿼리 부분에서 다르게 인코딩되어야 함을 의미합니다.

" http://example.com/blue+light%20blue?blue%2Blight+blue ".

여기에서 URL 구조를 구문 적으로 인식하지 않으면 완전히 구성된 URL을 인코딩 할 수 없다고 추론 할 수 있습니다.

이것은 다음과 같이 요약됩니다.

당신은해야 %20전과 ?+후.

출처


>> 전에 % 20이 있어야합니까? + + 바보 같은 질문에 대해 죄송합니다. 어떻게 든 해시 태그 매개 변수가 "?"뒤에 사용된다는 것을 알고 있습니다. 물음표 매개 변수. "#"을 사용해도 페이지가 다시로드되지 않기 때문에 다소 다릅니다. 그러나 "#"해시 태그 뒤에 % 20 및 + 기호를 사용하려고했지만 작동하지 않는 것 같습니다. "#"다음 중 어느 것을 사용해야합니까?
Philcyb


쿼리 부분에 실제로 "공식"표준이 있습니까? 기본적으로 그 부분은 응용 프로그램에 따라 다르다고 생각했습니다. 앱의 99.99 %는 key1=value1&key1=value2키와 값이 규칙에 encodeURIComponent따라 인코딩되는 곳에서 사용 하지만 쿼리 부분의 내용은 앱의 100 %에 달합니다. 그런 다음 #공식 인코딩이없는 첫 번째로만 이동합니다 .
gman

중복 된 질문에 대한 중복 답변! 그러나 흠, 나는 둘 다 포기했다.
Vladimir Vukanac

3
ASCII 구성 요소 레이블링은 장대 한 것입니다.
jsejcksn

25

나는 추천 할 것이다 %20.

하드 코딩하고 있습니까?

그러나 이것은 언어마다 매우 일관성이 없습니다. 내가 실수하지 않으면 PHP urlencode()에서 공백은 공백으로 취급 +하지만 파이썬 은 공백으로 urlencode()취급합니다 %20.

편집하다:

내가 착각 한 것 같아 파이썬 urlencode()(2.7.2 이상)은 공백 quote_plus()대신 quote()"+"를 대신 사용 하여 인코딩합니다. 또한 W3C 권장 사항은 여기에 따라 "+"인 것 같습니다 : http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

실제로 공간을 인코딩하는 데 사용할 수있는 파이썬 자체 문제 추적기 ( http://bugs.python.org/issue13866)에 대한이 흥미로운 토론을 따를 수 있습니다 .

편집 # 2 :

""을 (를) 인코딩하는 가장 일반적인 방법은 "+"와 같지만 참고 사항 일뿐입니다.이 점이 다소 혼란 스럽습니다.

import urllib
print(urllib.urlencode({' ' : '+ '})

>>> '+=%2B+'

하드 코딩이 아닙니다. 미적 관점에서 공백이 포함 된 URL의 모양을 결정하려고합니다.
BC.

안녕하세요, 혼란 스럽습니다. 사용자가 html 양식을 제출하면 양식이 어떻게 공간을 인코딩합니까? 어떤 캐릭터와 함께? 브라우저에 따라 결과가 달라 집니까?
GMsoF

1
그리고 URLEncoder.encode()Java 의 메소드도 변환합니다 +.
рüффп

그런 다음 POST 요청의 본문에서 인코딩을 처리하는 방법에 대한 의문이 발생합니다. "Content-Type : application / x-www-form-urlencoded", 여기서 매개 변수는 "a = b & c = d"형식입니다. 그러나 URL에는 전혀 없으며 "문서"의 본문 일뿐입니다. 그들은이 문제로 인해 엉망이되었으며 결정적인 대답을 찾기가 어렵습니다.
fyngyrz

Perls uri_escape ()는 그것들을 % 20으로 취급합니다
someuser

16

공백은 URL의 "application / x-www-form-urlencoded"콘텐츠 유형 키-값 쌍 쿼리 부분에서 "+"로 인코딩 될 수 있습니다. 내 의견으로는, 이것은 필수는 아니지만 MAY입니다. 나머지 URL에서는 % 20으로 인코딩됩니다.

필자의 의견으로는 공백 문자를 "로 인코딩해야한다고 지정한 HTML 사양 (RFC-1866)이기 때문에 URL의 쿼리 부분에서도 공백을 항상"+ "가 아닌 % 20으로 인코딩하는 것이 좋습니다. "application / x-www-form-urlencoded"컨텐츠 유형 키-값 쌍에서 + "(8.2.1. 하위 단락 1 참조)

양식 데이터를 인코딩하는이 방법은 이후의 HTML 사양에서도 제공됩니다. 예를 들어 HTML 4.01 사양 등에서 application / x-www-form-urlencoded에 관한 관련 단락을 찾으십시오.

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

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

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

구현은 선택한 프로그래밍 언어에 따라 다릅니다.

URL에 자국 문자가 포함 된 경우 먼저 UTF-8로 인코딩 한 다음 결과를 백분율로 인코딩하십시오.


1
요청 된 리소스가 HTML이 아닌 경우 HTML 사양에 관심을 가져야하는 이유는 무엇입니까? HTML로 응답하지 않는 일부 웹 API에서 "+"를 보았습니다 (예 : pdf 요청). "% 20"을 사용하지 않는 것이 잘못이라고 생각합니다.
놀라운 1

@TheincredibleJan, 나는 당신에 동의합니다. 그것이 제 대답입니다.
Maxim Masiutin

1
@MaximMasiutin 귀하의 답변에 "이것은 반드시 아닐 수 있습니다"라고 표시 될 때, 어떤 사양을 언급하고 있습니까? 나는 그것을 가진 사양을 찾기 위해 고심하고 있습니다. 에서 w3.org/TR/1999/REC-html401-19991224/interact/... (쿼리 섹션에서) '+'를 사용하는 것은 스펙의 '필수'섹션에 있습니다.
JosephH

2
@JosephH-메모 해 주셔서 감사합니다. MAY에 대한 저의 견해입니다. 게시물을 수정했습니다. 내가 의미하는 바는 qouted HTML 사양이 "+"를 정의하지만 URL 컨텍스트에서 인코딩 규칙을 % 20으로 허용하는 다른 규칙이 적용된다는 것입니다.
Maxim Masiutin 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.