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

URL의 공백은 언제 인코딩 +되고 언제 인코딩 %20됩니까?



답변

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

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

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


답변

이 혼란은 오늘날까지 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.

하드 코딩하고 있습니까?

그러나 이것은 언어마다 매우 일관성이 없습니다. 내가 실수하지 않으면 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의 “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로 인코딩 한 다음 결과를 백분율로 인코딩하십시오.


답변