URL 생성자가 쿼리 문자열의 괄호를 인코딩하지 않는 이유는 무엇입니까?
P粉287254588
2023-09-03 21:05:00
<p>JavaScript에서 <code>URL</code> 생성자는 검색어 문자열에 나타날 때 대괄호와 괄호를 인코딩하지 않습니다. 반면 <code>encodeURI</code> 또는 <code>encodeURIComponent</ code>는 항상 인코딩합니다. 쿼리 매개변수에 특수 문자를 포함할 때 대부분의 소스에서 <code>encodeURI</code>/<code>encodeURIComponent</code>를 사용하여 인코딩한다고 하기 때문에 혼란스럽습니다. <code>URL</code> 개체에 대해서도 유사한 동작이 예상되었습니다. </p>
<p>URL 개체의 쿼리 매개변수가 어떻게 인코딩될지 모르기 때문에 단위 테스트를 작성하는 데 문제가 발생합니다. 이를 명시하는 사양이 있습니까? 아니면 <code>URL</code> 생성자를 사용하기 전에 항상 매개변수를 인코딩해야 합니까? 도와주셔서 감사합니다. </p>
<시간 />
<p>검색어 문자열에서 대괄호를 인코딩하지 않은 URL 개체를 보여주는 예</p>
<pre class="brush:js;toolbar:false;">const href = (새 URL('https://foobar.com?myQuery={"@asdf/asdf":"1234"}' )).href;
// ^ https://foobar.com/?myQuery={%22@asdf/asdf%22:%221234%22}
</pre>
<p><code>encodeURI</code>를 사용하는 경우 유일한 차이점은 대괄호가 인코딩된다는 점입니다</p>
<pre class="brush:js;toolbar:false;">const href = encodeURI('https://foobar.com?myQuery={"@asdf/asdf":"1234"}');
// ^ https://foobar.com?myQuery=%7B%22@asdf/asdf%22:%221234%22%7D
</pre>
<시간 />
<p>참고: 검색어 매개변수에 괄호가 포함되어 있지 않으면 URL 개체가 이를 인코딩합니다. </p>
<pre class="brush:js;toolbar:false;">const href = (새 URL('https://foobar.com/}}}?myQuery={"@asdf/asdf":" 1234"}')).href;
// ^ https://foobar.com/%7D%7D%7D?myQuery={%22@asdf/asdf%22:%221234%22}
다양한 인코딩이 가능하며 모두 동일한 URL로 해석되어야 하므로 기술적으로 잘못된 것은 없습니다. 또 다른 예는 퍼센트 인코딩이 대문자나 소문자(
%aa
或%AA
),域名不区分大小写,空格可以被编码为+
或%20
(일부 부분에서는)를 사용할 수 있다는 것입니다.URL 인코딩의 특정 구현을 단위 테스트하려는 경우 문자열 일치를 수행할 수 있지만 두 URL이 인코딩 방법에 관계없이 동일한지 알고 싶다면 먼저 "정규화"라는 단계를 수행해야 합니다. , 비교한 다음.