2010. 9. 22. 12:37
자바스크립트에서 인코딩을 담당하는 함수입니다.
여기서 말하는 인코딩이란, 네트워크를 통해서 정보를 공유할 때 어떤 시스템에서나 읽을 수 있는 ASCII 문자로 바꿔주는 것을 말합니다. 모든 네트워크를 통한 전송에는 ASCII 문자가 기반이 되는데, 특히 한글이나 특수문자의 경우 이를 2진수 바이트코드로 변환해서 전송하면 받는 상대편의 시스템에 따라 잘못 해석되거나, 해석이 불가능할 수 있기 때문입니다.
이를 해결하기 위해 모든 시스템에서 공통으로 읽을 수 있는 ASCII 문자로 바꿔서 데이터를 전송할 필요가 있습니다.
1.escape()
아래와 같이 열거된 아스키문자가 아니라면 모두 유니코드 형식으로 변환합니다.
1바이트 문자는 빈칸(%20)을 들 수 있고, 2바이트 문자는 한글(%uD55C%uAE00)이 있을 수 있습니다.
가끔 인터넷검색을 하면 주소창에 %XX형식의 문자들이 들어있는 것을 볼 수 있는데, 이는 인코딩 된 것의 한 종류라고 볼 수 있습니다.
가끔은 홈페이지의 자바스크립트나 HTML 소스, 음원URL을 보기 힘들게 하기 위해 사용하기도 하지만, 이는 자바스크립트의 인코딩을 아는 자라면 어렵지 않게 풀어 사용할 수 있습니다.
2.encodeURI()
기본적으로는 escape()와 비슷한 동작을 하지만 인터넷 주소 표시에 쓰이는 특수문자들은 인코딩하지 않습니다.
3.encodeURIComponent()
기본적인 동작은 역시 escape()와 비슷하지만 인터넷 주소표시에 쓰이는 모든 문자를 추가로 인코딩합니다.
그래서 인터넷주소(URL) 전체를 인코딩할 때는 사용할 수 없고, 넘기는 필드 하나하나를 따로 인코딩할 때 사용합니다.
그 이유는 넘어가는 값이 text="test=&테스트" 이와 같이 text라는 필드 값이 test=&테스트인 경우 그냥 encodeURI()로 인코딩 하면, '=' 나 '&'는 인코딩되지 않아서 필드 값을 처리할 때 데이터 값이 아닌 여러 개의 필드를 넘기는 명령어로 인식할 수 있기 때문입니다.
하지만, "http://test.com/test.php?text=테스트" 와 같은 URL 전체를 encodeURIComponent()로 인코딩하게 되면 : / ? 를 모두 인코딩하여 주소를 인식할 수 없게 됩니다.
여기서 말하는 인코딩이란, 네트워크를 통해서 정보를 공유할 때 어떤 시스템에서나 읽을 수 있는 ASCII 문자로 바꿔주는 것을 말합니다. 모든 네트워크를 통한 전송에는 ASCII 문자가 기반이 되는데, 특히 한글이나 특수문자의 경우 이를 2진수 바이트코드로 변환해서 전송하면 받는 상대편의 시스템에 따라 잘못 해석되거나, 해석이 불가능할 수 있기 때문입니다.
이를 해결하기 위해 모든 시스템에서 공통으로 읽을 수 있는 ASCII 문자로 바꿔서 데이터를 전송할 필요가 있습니다.
1.escape()
아래와 같이 열거된 아스키문자가 아니라면 모두 유니코드 형식으로 변환합니다.
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
1234567890
@*-_+./
변환된 형식은 16진수 형식으로 표시되며 1바이트 문자는 %XX 형태로, 2바이트 문자는 %uXXXX 형태로 변환됩니다.abcdefghijklmnopqrstuvwxyz
1234567890
@*-_+./
1바이트 문자는 빈칸(%20)을 들 수 있고, 2바이트 문자는 한글(%uD55C%uAE00)이 있을 수 있습니다.
가끔 인터넷검색을 하면 주소창에 %XX형식의 문자들이 들어있는 것을 볼 수 있는데, 이는 인코딩 된 것의 한 종류라고 볼 수 있습니다.
가끔은 홈페이지의 자바스크립트나 HTML 소스, 음원URL을 보기 힘들게 하기 위해 사용하기도 하지만, 이는 자바스크립트의 인코딩을 아는 자라면 어렵지 않게 풀어 사용할 수 있습니다.
2.encodeURI()
기본적으로는 escape()와 비슷한 동작을 하지만 인터넷 주소 표시에 쓰이는 특수문자들은 인코딩하지 않습니다.
인터넷 주소 표시 특수문자 : ; / = ? & 등
그래서 보통은 파라미터를 전달하는 인터넷주소(URL) 전체를 인코딩할 때 사용합니다.3.encodeURIComponent()
기본적인 동작은 역시 escape()와 비슷하지만 인터넷 주소표시에 쓰이는 모든 문자를 추가로 인코딩합니다.
그래서 인터넷주소(URL) 전체를 인코딩할 때는 사용할 수 없고, 넘기는 필드 하나하나를 따로 인코딩할 때 사용합니다.
그 이유는 넘어가는 값이 text="test=&테스트" 이와 같이 text라는 필드 값이 test=&테스트인 경우 그냥 encodeURI()로 인코딩 하면, '=' 나 '&'는 인코딩되지 않아서 필드 값을 처리할 때 데이터 값이 아닌 여러 개의 필드를 넘기는 명령어로 인식할 수 있기 때문입니다.
하지만, "http://test.com/test.php?text=테스트" 와 같은 URL 전체를 encodeURIComponent()로 인코딩하게 되면 : / ? 를 모두 인코딩하여 주소를 인식할 수 없게 됩니다.
인코딩 값을 서버에서 디코딩 처리하고자 하실 때는
Java 경우 URLDecoder.decode(String, "UTF-8") / 여기서 UTF-8 은 HTML Page charset 입니다.
Java 경우 URLDecoder.decode(String, "UTF-8") / 여기서 UTF-8 은 HTML Page charset 입니다.