인코딩을 사용해야 합니까?URI 또는 인코딩URL 인코딩을 위한 URIC 구성 요소
URL 인코딩에는 다음 두 가지 방법 중 어떤 방법을 사용해야 합니까?
그것은 당신이 실제로 무엇을 하고 싶은지에 달려 있다.
encodeURI 에서는 입력에 부호화가 필요한 문자가 포함되어 있을 가능성이 있는 완전한 URI라고 가정합니다.
encodeURIComponent는 모든 것을 특별한 의미로 인코딩하기 때문에 다음과 같은 URI 컴포넌트에 사용합니다.
var world = "A string with symbols & characters that have special meaning?";
var uri = 'http://example.com/foo?hello=' + encodeURIComponent(world);
URL 컴포넌트(querystring 파라미터)에 넣을 문자열을 인코딩하는 경우encodeURIComponent
.
기존 URL을 인코딩하는 경우encodeURI
.
xkr.us에서는 예를 들어 훌륭한 토론이 있습니다.요약하면:
excape() 메서드는 서버 측의 공백으로 해석되며 필드에 공백이 있는 형식으로 생성되는 + 문자를 인코딩하지 않습니다.이 단점과 이 함수가 비 ASC를 처리할 수 없다는 사실로 인해올바른 II 문자는 가능한 한 excape() 사용을 피해야 합니다.최선의 대안은 보통 부호화입니다.URIC 컴포넌트().
excape()는 부호화하지 않습니다.@ * / +
encodeURI() 메서드는 querystring(URL의 일부)이 아닌 URI를 인코딩한다는 점에서 excape()보다 조금 더 전문적입니다.URI를 사용하는 리소스에 사용할 문자열을 인코딩해야 하며 특정 문자를 인코딩되지 않은 상태로 유지해야 할 경우 이 메서드를 사용합니다.이 메서드는 URI 내에서 유효한 문자이므로 ' 문자를 인코딩하지 않습니다.
encodeURI()는 인코딩하지 않습니다.~!@#$&*()=:/,;?+'
마지막으로 부호화대부분의 경우 URI의 단일 컴포넌트를 인코딩할 때 URIComponent() 메서드를 사용해야 합니다.이 메서드는 보통 URI의 특수 문자로 인식되는 특정 문자를 인코딩하여 많은 컴포넌트를 포함할 수 있도록 합니다.이 메서드는 URI 내에서 유효한 문자이므로 ' 문자를 인코딩하지 않습니다.
encodeURIComponent()는 부호화하지 않습니다.~!*( ).
여기 요약이 있습니다.
escape()는 @ * _ + - . / 를 인코딩하지 않습니다.
사용하지 마십시오.
encodeURI()는 A-Z a-z 0-9; , / ? : @ & = + $ - _ . ~ * ' ( )#을 인코딩하지 않습니다.
입력이 'https://searchexample.com/search?q=wiki''과 같은 완전한 URL일 때 사용합니다.
- encodeURIComponent()는 A-Z a-z 0-9 - _!~*'를 인코딩하지 않습니다.입력 내용이 완전한 URL의 일부일 때 사용합니다.
const queryStr = encodeURIComponent(someString)
encodeURI 및 encodeURIC 컴포넌트는 다양한 용도로 사용됩니다.
차이점 중 일부는
encodeURI는 완전한 URL 인코딩에 사용되며,URIC 구성 요소는 쿼리 문자열 등의 URI 구성 요소를 인코딩하기 위해 사용됩니다.
인코딩으로 인코딩되지 않은 11개의 문자가 있습니다.URI이지만 인코딩으로 인코딩됨URIC 컴포넌트리스트:
성격 | 인코딩 | encodeURIC 컴포넌트 |
---|---|---|
# | # | %23 |
$ | $ | %24 |
& | & | %26 |
+ | + | %2 B |
, | , | %2C |
/ | / | %2F |
: | : | %3A |
; | ; | %3B |
= | = | %3D |
? | ? | %3F |
@ | @ | %40 |
주의:
encodeURIComponent가 -_!를 인코딩하지 않음~*'(). 이러한 문자를 인코딩하려면 해당 UTF-8 문자 시퀀스로 대체해야 합니다.
인코딩에 대해 자세히 알아보려면URI 및 인코딩URL 구성 요소 참조 링크를 확인하십시오.참조 링크
encodeURIComponent() : 인수가 URI의 일부(프로토콜, 호스트 이름, 경로 또는 쿼리 문자열 등)인 것으로 가정합니다.따라서 URI의 일부를 구분하기 위해 사용되는 구두점 문자는 생략됩니다.
encodeURI(): 기존 URL 인코딩에 사용됩니다.
의 차이점encodeURI
그리고.encodeURIComponent
:
encodeURIComponent(value)
주로 queryString 파라미터 값을 부호화하기 위해 사용되며, queryString은 의 모든 해당 문자를 부호화합니다.value
.encodeURI
는 프로토콜 프레픽스를 무시합니다(http://
도메인명)을 지정합니다.
매우 드문 경우이지만, 다음과 같은 수동 인코딩을 구현하여 추가 문자를 인코딩하려는 경우(일반적인 경우에는 인코딩할 필요가 없습니다).! *
, 그 후 다음을 사용할 수 있습니다.
function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}
(소스)
다른 답변에서는 그 목적을 설명합니다.각 함수가 실제로 변환하는 문자는 다음과 같습니다.
control = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F'
+ '\x10\x11\x12\x13\x14\X15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F'
+ '\x7F'
encodeURI (control + ' "%<>[\\]^`{|}' )
encodeURIComponent(control + ' "%<>[\\]^`{|}' + '#$&,:;=?' + '+/@' )
escape (control + ' "%<>[\\]^`{|}' + '#$&,:;=?' + "!'()~")
위의 모든 문자는 퍼센트 16진수 코드로 변환됩니다.공간:%20
, % ~의%25
, 등. 아래 문자는 변경되지 않고 그대로 통과합니다.
함수가 변환하지 않는 문자는 다음과 같습니다.
pass_thru = '*-._0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
encodeURI (pass_thru + '#$&,:;=?' + '+/@' + "!'()~")
encodeURIComponent(pass_thru + "!'()~")
escape (pass_thru + '+/@' )
일반적인 규칙 사용encodeURIComponent
긴 이름이 더 구체적인 사용법이라고 생각하고 두려워하지 마세요.저에게는 더 일반적으로 사용되는 방법입니다.또한 인코딩을 사용하도록 속이지 마십시오.URI를 테스트한 결과 올바르게 인코딩되어 있는 것처럼 보였기 때문에 URI는 아마도 사용하려는 것이 아닐 것입니다.또한 이름 필드에 "Fred"를 사용한 간단한 테스트는 성공했지만 나중에 앰퍼샌드나 해시태그 추가와 같은 고급 텍스트를 사용하면 실패합니다.그 이유에 대해서는, 다른 답을 참조해 주세요.
언급URL : https://stackoverflow.com/questions/4540753/should-i-use-encodeuri-or-encodeuricomponent-for-encoding-urls
'programing' 카테고리의 다른 글
mysql에서 글로벌 sql_mode 설정 (0) | 2022.11.18 |
---|---|
함수를 가변 길이 인수로 래핑하려면 어떻게 해야 합니까? (0) | 2022.11.18 |
python 추적 분할 결함 (0) | 2022.11.18 |
Java에서는 상수 클래스를 어떻게 정의합니까? (0) | 2022.11.18 |
Python에는 왜 태플 이해가 없습니까? (0) | 2022.11.18 |