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로 인코딩 한 다음 결과를 백분율로 인코딩하십시오.