decodeURIComponent와 decodeURI의 차이점은 무엇입니까?


답변:


398

이 두 가지의 차이를 설명하기 위해 나 사이의 차이를 설명하게 encodeURI하고 encodeURIComponent.

주요 차이점은 다음과 같습니다.

  • encodeURI기능은 전체 URI에서 사용하기위한 것입니다.
  • encodeURIComponent함수는 구분 기호 (; /? : @ & = + $, #) 사이에있는 부분 인 .. well .. URI 구성 요소에서 사용하도록 고안되었습니다.

따라서 encodeURIComponent이러한 구분 기호는 특수 문자가 아닌 텍스트로 간주되기 때문에 인코딩됩니다.

디코드 함수의 차이점으로 돌아가서, 각 함수는 특수 문자의 의미와 처리를 처리하여 해당 인코딩 대응 물에 의해 생성 된 문자열을 디코드합니다.


4
또 다른 중요한 차이점은 unscape가 멀티 바이트 UTF-8 시퀀스를 처리하지 않고 decodeURI [Component]가 처리한다는 것입니다.decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
chris

IMHO, 몇 가지 예를 들면 매우 유용합니다
transang

114

encodeURIComponent / decodeURIComponent ()는 URI 부분에서 텍스트 문자열을 서로 연결하고 분리하기 위해 거의 항상 사용하려는 쌍입니다.

덜 일반적이고 잘못 이름이 지정된 encodeURI : 실제로는 fixBrokenURI라고합니다. 그것은 거의 URI 인 것을 취하지 만 공백과 같은 유효하지 않은 문자를 가지고 실제 URI로 바꿉니다. 사용자 입력에서 유효하지 않은 URI를 수정하는 데 유효하게 사용되며 IRI (유니 코드 문자가 포함 된 URI)를 일반 URI (% 이스케이프 처리 된 UTF-8을 사용하여 비 ASCII로 인코딩)로 변환하는 데 사용할 수도 있습니다. ).

decodeURI는 몇 가지 특수 문자를 제외하고 decodeURIComponent와 동일한 문자를 디코딩합니다. 그것은 encodeURI의 역수로 제공되지만, 원래 넣은 것과 똑같이 리턴한다고 믿을 수는 없습니다. 예를 들어보십시오. decodeURI(encodeURI('%20 '));.

encodeURI의 이름을 fixBrokenURI ()로 지정해야하는 경우 decodeURI ()를 동일한 이름으로 potentialBreakMyPreviouslyWorkingURI ()라고 할 수 있습니다. 나는 그것을 어디에도 사용할 수 없다고 생각할 수있다. 기피.


11
decodeURI (encodeURI ( '% 20'))은 크롬과 파이어 폭스에서 '% 20'을 올바르게 제공합니다.
ccppjava

1
2009 년에 깨졌을 수도 있지만 현대 브라우저는 그 동안 붙잡 혔습니다 (내 추측).
WoodrowShigeru

68
js> s = "http://www.example.com/string with + and ? and & and spaces";
http://www.example.com/string with + and ? and & and spaces
js> encodeURI(s)
http://www.example.com/string%20with%20+%20and%20?%20and%20&%20and%20spaces
js> encodeURIComponent(s)
http%3A%2F%2Fwww.example.com%2Fstring%20with%20%2B%20and%20%3F%20and%20%26%20and%20spaces

콜론과 슬래시 및 더하기 문자를 추가로 인코딩하고 쿼리 문자열에 사용하기 위해 encodeURI공백과 일부 (예 : 인쇄 할 수없는) 문자를 인코딩하여 "안전한"URI를 생성하는 것처럼 보입니다 encodeURIComponent. +와?의 인코딩 &는 쿼리 문자열의 특수 문자이므로 &가 여기에서 특히 중요합니다.


30

나는 같은 질문을했지만 여기서 대답을 찾지 못했기 때문에 실제로 차이점이 무엇인지 알아 내기 위해 몇 가지 테스트를 수행했습니다. URL / URI와 관련이없는 무언가에 대한 인코딩이 필요하기 때문에이 작업을 수행했습니다.

  • encodeURIComponent("A") "A"를 반환하고 "A"를 "% 41"로 인코딩하지 않습니다
  • decodeURIComponent("%41") "A"를 반환합니다.
  • encodeURI("A") "A"를 반환하고 "A"를 "% 41"로 인코딩하지 않습니다
  • decodeURI("%41") "A"를 반환합니다.

즉, 영숫자 문자를 인코딩하지 않아도 문자를 디코딩 할 수 있습니다. 하나...

  • encodeURIComponent("&") "% 26"을 반환합니다.
  • decodeURIComponent("%26") "&"를 반환합니다.
  • encodeURI("&") "&"를 반환합니다.
  • decodeURI("%26") "% 26"을 반환합니다.

encodeURIComponent가 모든 문자를 인코딩하지는 않지만 decodeURIComponent는 % 00과 % 7F 사이의 값을 디코딩 할 수 있습니다.

참고 : 유니 코드 값이 아닌 경우 % 7F 이상의 값을 디코딩하려고하면 스크립트가 "URI 오류"로 실패합니다.


참고 : 첫 번째 decodeURIComponent에는 오타가 있습니다 (n 대신 m). 6 자 이상을 편집해야하므로 수정할 수 없습니다.
SuperNova

23

encodeURIComponent()

입력을 URL 인코딩 문자열로 변환

encodeURI()

입력을 URL로 인코딩하지만 전체 URL이 제공되었다고 가정하므로 프로토콜 (예 : http : // ) 및 호스트 이름 (예 : www.stackoverflow.com )을 인코딩하지 않고 유효한 URL을 반환합니다 .

decodeURIComponent()그리고 decodeURI()위의 반대입니다


12

decodeURIComponent는 &,?, # 등과 같은 URI 특수 마커를 디코딩하지만, decodeURI는 그렇지 않습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.