2009-03-06 3 views
42

또 다른 질문에 대답하면서 나는 내가 지금 사용하고있는 것처럼 보인 반면에 URL 구성 요소의 내용을 인코딩하기 위해 여전히 escape/unescape을 사용하고 있다는 점에서 나의 Javascript/DOM 지식이 다소 오래된 것임을 알게되었다. encodeURIComponent/decodeURIComponent .decodeURIComponent 대 unescape, unescape의 문제점은 무엇입니까?

내가 알고 싶은 것은 escape/unescape과 함께 무엇이 잘못 되었습니까? 유니 코드 문자 주위에 어떤 종류의 문제가 있다는 모호한 제안이 있지만 명확한 설명을 찾을 수 없습니다.

필자의 웹 경험은 상당히 편향되어 있으며, 거의 모든 것이 인터넷 익스플로러에 묶여있는 큰 인트라넷 응용 프로그램을 작성하고 있습니다. 그게 많은 escape/unescape의 사용을 포함하고 관련된 애플 리케이션은 이제 다년간 유니 코드를 완벽하게 지원합니다.

그래서 escape/unescape에있는 유니 코드 문제는 무엇입니까? 누구든지 문제를 입증 할 테스트 케이스가 있습니까?

+0

내가이 [문서 커버] 생각은이 웹 사이트에 온라인으로 일하고있어 이것이다 (http://xkr.us/articles/javascript/encode-compare/)를 꽤 잘 –

+0

우수함, 내가 원했던 것. 문제는 Mozilla가 이스케이프에서 유니 코드에 대처하지 않는다는 것인데, IE 전용 응용 프로그램을 사용하여 문제가 발생하지 않은 이유가 설명됩니다. – andynormancx

+0

나는 IE만의 인트라넷 어플리케이션으로 작업 한 나의 역사에 축복 받고 저주를 받았다. IE/FF 차이점에 대처할 필요가 없으며 동일한 이유로 저주하기 때문에 축복 받았습니다. – andynormancx

답변

37

내가 알고 싶은 것은 탈출/유령 제거가 잘못 되었습니까?

그들은 "잘못된"것이 아니며 URI 매개 변수 인코딩과 비슷하지만 실제로는 그렇지 않은 특수 문자열 형식입니다. 특히 :

  • '+'유니 코드 UTF-16 코드 포인트를 인코딩하는 특별한 "% uNNNN"형식 대신 인코딩 UTF-8 바이트로,이
  • 하지 공간을 의미 플러스

따라서 escape()을 사용하여 URI 매개 변수 값을 만들면 더하기 기호 또는 비 ASCII 문자가 포함 된 문자열에 대해 잘못된 결과가 표시됩니다.

escape()는 쿠키 값을 이스케이프하는 것과 같은 내부 JavaScript 전용 인코딩 체계로 사용할 수 있습니다. 그러나 모든 브라우저가 encodeURIComponent (원래는 그렇지 않았 음)를 지원 했으므로 이스케이프를 우선 사용하지 않아도됩니다.

이 내가 아는 탈출/언 이스케이프에 대해 하나의 현대적인 사용하고, 그 URIComponent 처리에 UTF-8 처리를 활용함으로써, UTF-8 인코더/디코더를 구현하는 빠른 방법으로이다 :

utf8bytes= unescape(encodeURIComponent(unicodecharacters)); 
unicodecharacters= decodeURIComponent(escape(utf8bytes)); 
+0

위의 참조 : http://unixpapa.com/js/querystring.html - 사용되지 않는 이스케이프/이스케이프, 벙어어는 encodeURI/decodeURI 및 decodeURIComponent/encodeURIComponent - quirks 및 사용 방법. decodeURIComponent는 "+"를 공백으로 변환하지 않습니다. –

+0

이스케이프는 작은 따옴표를 이스케이프 처리하지만 encodeURI는 이스케이프 처리하지 않습니다. 그래서 내 프로젝트에는 쓸모 없게된다. –

+0

bobince- 나는 현재 utf8bytes = unescape (encodeURIComponent (unicodecharacters))를 얻기 위해이 방법을 사용하고 있습니다. 브라우저가 이스케이프 방법을 지원하지 않으면 어떻게 동일한 결과를 얻을 수 있습니까? 감사. – acabra85

4

잘못된 UTF8 바이트 시퀀스가 ​​포함될 수있는 URI 인코딩 문자열을 구문 분석하는 또 다른 "현대적인"사용이 있습니다. 경우에 따라 decodeURIComponent가 예외를 throw 할 수 있습니다. 이 예외를 잡아서 unescape 사용으로 되돌아 가야 할 수도 있습니다.

예를 들어 'tür'는 파이어 폭스가 만든 't % FCr'로 인코딩되어 있습니다 (? 뒤에 주소 표시 줄에 글자를 붙여 넣을 때).

+0

Firefox에서 버그가 수정 된 것 같습니다. 그러나 일부 사람들이 UTF-8 대신 ISO-8859-1을 사용하여 문자를 잘못 인코딩 할 가능성은 거의 없습니다. –

7

escape은 0에서 255까지의 문자 (ISO-8859-1, 유효하게는 단일 바이트로 표현할 수있는 유니 코드 코드 포인트)에서만 작동합니다. (*)

encodeURIComponent은 자바 스크립트가 표현할 수있는 모든 문자열 (현재 사용중인 거의 모든 필기체를 다루는 유니 코드 코드 포인트 0에서 1,114,111 또는 0x10FFFF까지)에서 작동합니다.

두 함수

는에 만 escape에서 익숙한 UTF-8 문자열을 암호화 한 후 %XX 진수 인코딩을 적용 처음으로 코드 포인트 0 ~ 127 포함 (US-ASCII), 후자의 달성을 사용하여 URL 안전 문자열을 생산 안전하지 않은 코드 포인트. unescapedecodeURIComponent 버전이 역으로 동일한 작업을 수행으로 어떤 루프 또는 쓰레기 발생이없는 make a two-funcall UTF-8 encoder/decoder 자바 스크립트에서 이러한 기본 요소를 결합함으로써 UTF-8 처리의 부작용을 제외한 모든 상쇄 할 수있는 이유

은 부수적이다.

(*)가 발 노트

: 구글 크롬 같은 일부 최신 브라우저가 처음에 정의되지 않은 이스케이프 문자의 위-255 범위 % Uxxxx에 생산 불통하지만 한 해당 인코딩 디코딩을위한 웹 서버 지원은하지 않습니다 IETF 표준 UTF-8 기반 인코딩을 디코딩하는 것으로 잘 구현됩니다.