2010-02-10 6 views
3

서버에 http-get 요청을 수행 할 때 여전히 이해할 수없는 것이 있다면 JS 기능인 encodeURIcomponent를 사용하여 http-의 각 구성 요소를 인코딩 할 때 장점이 무엇입니까?encodeURIComponent가 정말 유용합니까?

일부 테스트하기 나는 (PHP를 사용하는) 서버가 http-get 요청의 값을 적절하게 얻는 것을 보았습니다. encodeURIcomponent를 사용하지 않으면! 분명히 클라이언트 레벨에서 여전히 특수 문자 &을 인코딩해야합니까? =/: 그렇지 않으면 "peace & love = virtue"와 같은 http-get 값은 하나의 단일 값 대신 http-get 요청의 새로운 키 값 쌍으로 간주됩니다. 하지만 encodeURIcompenent는 'è'와 같이 utf8_decode 함수를 사용하여 PHP 서버에서 디코딩되어야하는 % C3 % A8로 변환되는 많은 다른 문자도 인코딩합니다. PHP에서 그들을 점점 때 HTTP-얻을 요청의 모든 값이 인코딩 UTF8 있습니다에 encodeURIComponent를 사용하여

따라서 나는 매우 성가신 각 $ _GET 값 될 때마다 utf8_decode 함수를 호출해야합니다.

왜 & 만 인코딩 할 수 있습니까? =/: 문자?

도 참조 : JS encodeURIComponent result different from the one created by FORM 그것은 간단한 브라우저 FORM의 GET은 '€'와 같은 문자를 인코딩하기 때문에 encodeURIComponent 심지어 다른 방식으로, 제대로 인코딩하지 않음을 보여줍니다. 그래서 나는이 encodeURIComponent가 무엇을위한 것인지 궁금해한다. 인

답변

5

이것은 문자 인코딩 문제 (again)입니다. 개비 (Gaby)가 말했듯이 URI는 일련의 ASCII 문자입니다 (따라서 0-127 범위의 바이트 만 가능). 따라서 ASCII가 아닌 다른 문자는 Percent-Encoding으로 인코딩해야합니다.

UTF-8은 새로운 "보편적 인 문자 인코딩"이기 때문에 요즘 사용 도구는 URI를 UTF-8로 해석합니다. 그러나 이러한 UTF-8로 인코딩 된 단어 자체도 Percent-Encoding으로 인코딩됩니다. URI는 ASCII 문자를 제외한 다른 문자를 포함 할 수 없기 때문입니다. 의미

, 브라우저의 주소 필드에 http://en.wikipedia.org/wiki/€를 입력, 브라우저가 (0xE282AC)에 대한 UTF-8 코드를 검색하고 (%E2%82%AC)의 퍼센트 인코딩을 적용합니다. 따라서 http://en.wikipedia.org/wiki/€은 실제로는 http://en.wikipedia.org/wiki/%E2%82%AC이됩니다.

이 사실을 보여주기 위해 주소 입력란에 http://en.wikipedia.org/wiki/%E2%82%AC을 입력하면 브라우저가 http://en.wikipedia.org/wiki/€으로 바뀝니다.요즘 사용 도구가 UTF-8로 인코딩 된 URI를 해석하기 때문입니다.

처음 질문에 백분율 인코딩을 명시 적으로 적용해야하는 이유는 다음과 같습니다. 유로 기호에 위키 백과 문서에 연결하려는 웹 페이지가 있다고 가정 해보십시오. 당신은 그냥 일반 로 URI를 작성하는 경우 :

<a href="http://en.wikipedia.org/wiki/€">Euro sign</a> 

브라우저는 문자 문서의 문자 인코딩을 사용합니다. 즉, 문서의 인코딩이 Windows-1252 인 경우 (your other question) 은 0x80로 인코딩되고 URI는 http://en.wikipedia.org/wiki/%80입니다 (위키 피 디아는 Windows 1252가 가장 인기있는 문자이기 때문에 위키 백과가 실제로 똑같이 작동하기 때문에 실제로 작동합니다. 0x80에 인쇄 가능한 문자로 인코딩).

그러나 문서의 인코딩이 ISO 8859-15 경우, 은 ISO 8859-1에서 currency sign ¤ 나타냅니다 0xA4로 인코딩됩니다 (0xA4이 UTF-8에서 잘못된 바이트 순서가 있기 때문에 위키 백과는 ISO 8859-1을 선택합니다 및 HTTP specifies ISO 8859-1 as default character encoding).

그래서 은 실수를 피하기 위해 항상 백분율 인코딩을 사용하는 것이 좋습니다. 사용자 에이전트가 당신이 의미하는 바를 추측하게하지 마십시오.

7

균일 자원 식별자 (URI)가 시퀀스 US-ASCII의 레퍼토리 제한된 서브 세트로부터 선택된 문자 으로 [RFC3986]에 정의 이다 ASCII 때문에 ] 자입니다.

공식적으로 유니 코드는 지원되지 않습니다. 자세한 내용은 see the RFC을 참조하십시오. 모든 현대의 브라우저가 그것을 지원하지만, 그 이유는 당신이 결과를 잘 얻을 수 있습니다 ..하지만 이상한 경우에는 그것을 지원하지 않는 일부 브라우저 나 시스템이 인코딩하고 모든 표준 호환 브라우저에서 잘 작동하는지 확인하십시오 ..

+0

그래서 기본적으로 encodeUriCompenent 사용을 피할 수 있다고 말하고 있습니까? 그리고 단순히 '&', '?', '=', '/', ':'와 같은 특수 문자를 인코딩하십시오. 이것은 근본적으로 지금 브라우저의 대다수를 위해 작동 할 것입니다. –

+0

그것은 대다수의 브라우저에서 작동 할 것입니다.하지만 URL은 포럼/블로그/등등에 게시됩니다. 포럼/블로그/etc가 유니 코드가 아닌 경우 (내부적으로 사이트에 연결) 엉망이 될지도 .. –

관련 문제