본문 바로가기

프로그래밍/JSP

JSP 한글 처리 이야기 (EUC-KR, UTF-8)
















JSP 한글 처리 이야기 (EUC-KR, UTF-8)JSP

 

출처 : http://blog.naver.com/musasin84/60189864851

 

 

 


 


JSP 한글 처리 이야기 (EUC-KR, UTF-8)


프로젝트 진행 시 한글깨짐으로 인한 스트레스는 누구나 경험해 보았을 것입니다.

검색시 GET, POST 방식에 한글이 깨지는 경우가 있습니다.

이런 이유를 확실히 이해하고자 이와 같이 정리 합니다.

테스트로 EUC-KR 과 UTF-8 프로젝트를 동일한 코드로 실행해보겠습니다.

(캐릭터셋 문자열만 다르므로 UTF-8로 테스트 하겠습니다. 소스는 동일)

 

테스트 개발환경

Tomcat 6.0 , eclipse-jee-galileo-SR2-win32

 

프로젝트 디렉토리 경로

 

 

eucKrTestd의 이름으로 Dynamic Web Project를 생성하였습니다.

WebContent 를 ROOT로 잡고 index.jsp 파일을 생성 하였구요.

 

프로젝트 환경설정에서 프로젝트 캐릭터셋 변경

 

 

프로젝트 선택 후 Properties 환경설정에서 Resource 에서의 UTF-8로 설정 하였어요. 파일들이 다 UTF-8로 바뀌겠죠?

 

JSP 파일 소스 작성 (자바스크립트 인코딩 변환 메소드 포함)

 

 

스크립트의 인코딩 처리하는 메소드와 간단한 텍스트 박스 폼, 링크, 서브밋버튼을 구성하였습니다.

파라미터의 값을 출력해서 볼 수 있게 스크립틀릿을 작성하였구요.

소스에서 보이는 캐릭터셋은 대문자면 대문자, 소문자면 소문자로 통일 합니다.

encodeURI("http://www.google.co.kr/돌.html")

한글을 인코딩하는 메소드 입니다. 결과 값은 http://www.google.co.kr/%EB%8F%8C.html

 

decodeURI("http://www.google.co.kr/%EB%8F%8C.html")

인코딩된 문자열을 디코딩해줍니다. 결과 값은 http://www.google.co.kr/돌.html

 

encodeURIComponent("http://www.google.co.kr/돌.html")

encodeURI 와 비슷 특수문자 ://, / 도 인코딩. 결과 값은 http%3A%2F%2Fwww.google.co.kr%2F%EB%8F%8C.html

 

decodeURIComponent("http%3A%2F%2Fwww.google.co.kr%2F%EB%8F%8C.html")

인코딩된 문자열을 디코딩 해줍니다. 결과 값은 http://www.google.co.kr/돌.html

 

escape("http://www.google.co.kr/돌.html")

한글을 유니코드로 변환 합니다. 결과 값은 http://www.google.co.kr/%uB3CC.html

 

unescape("http://www.google.co.kr/%uB3CC.html")

유니코드로 변환된 문자열을 디코딩 해줍니다. 결과 값은 http://www.google.co.kr/돌.html

 

위의 자바스크립트 메소드와 비슷한 자바 메소드는

java.net.URIEncoder.encode("문자열", "캐릭터셋") 과 java.net.URIDecoder.decode("문자열", "캐릭터셋")

이 있습니다.

 

request.setCharacterEncoding("utf-8");

POST로 넘어오는 값에 대해 캐릭터셋 지정 합니다. 이 부분은 web.xml 에서 정의 할 수도 있습니다.

 

개발자들이 필터를 만들어 등록하기도 하죠. 요세는 프레임워크(struts2, spring 등)에 필터가 있어 캐릭터셋만 지정해

주면 되었죠. 그럼 중복된 위의 코드를 POST로 받는 부분 마다 작성을 안하여도 되죠.

스트럿츠2 2.1.x 일 시

  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

Spring 일 시

  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

 

톰켓의 server.xml 수정

 

 

GET방식으로 서버에 요청하는 파라미터 값에 대해 문자열 인코딩 캐릭터셋을 지정 합니다.

한글 파라미터에 대한 UTF-8로 인코딩하게 됩니다. (EUC-KR 환경이라면 URIEncoding="EUC-KR")

톰켓 뿐 아니라 모든 WAS는 유사한 설정을 하게 됩니다.

 

결과보기

 

 

톰켓을 실행하고 브라우저에서 확인해보면 위와 같습니다.

 

자 그럼 클릭해볼까요.

<a href="/?stone=%EB%8F%8C">A태그 한글넘기기</a>

 out.println(new String(str.getBytes("ISO-8859-1"), "utf-8"));       결과 값 : ??
 out.println(request.getParameter("stone"));                              결과 값 : 돌
 

<a href="/?stone=돌">A태그 한글넘기기</a>

 out.println(new String(str.getBytes("ISO-8859-1"), "utf-8"));       결과 값 : ?

 out.println(request.getParameter("stone"));                              결과 값 : 돌

 

<input type="submit" value="한글서브밋" /> TEXT 박스에 '돌' 작성

 out.println(new String(str.getBytes("ISO-8859-1"), "utf-8"));       결과 값 : ?

 out.println(request.getParameter("stone"));                              결과 값 : 돌

 

out.println(new String(str.getBytes("ISO-8859-1"), "utf-8")); 

이 출력 결과는 다 깨지죠? 만약 톰켓의 server.xml에 URIEncoding="UTF-8"을 지웠다면 깨지지 않습니다.

어렵죠? HTML의 문서 기본 캐릭터셋은 ISO-8859-1 입니다. 이 캐릭터셋은 서유럽언어들이 대부분이죠. Latin-1 이라고

도 합니다.  하지만 우리는 jsp파일내에 캐릭터셋 모두 utf-8로 했어요.

우리가 GET방식으로 '돌'이라는 파라미터를 서버에 요청 시 URIEncoding="UTF-8" 설정에 의해 '돌'이라는 문자열은

'%EB%8F%8C' 이렇게 변환하게 됩니다. 그리고 jsp 파일의 캐릭터셋이 utf-8이므로 '돌' 이라는 문자열을 볼 수 있죠.

만약 URIEncoding="UTF-8" 이 설정을 지웠다면 GET방식으로 보낸 '돌'이라는 한글 파라미터는 디폴트 속성 캐릭터셋인

ISO-8859-1로 인코딩하게 됩니다. 그래서 new String(str.getBytes("ISO-8859-1"), "utf-8") 이와 같이 변환 후

출력해보면 '돌' 이라는 문자열을 볼 수 있죠.

 

중요내용

브라우저의 URL 입력창에 http://localhost:8080/?stone=돌 치는 순간.   '돌'이 깨져서 나옵니다.

어라? <a href="/?stone=돌">A태그 한글넘기기</a> 이건 안깨졌었죠? 이건 더 깊숙히 들어가야 알 사항입니다.

알고만 있어요 우리는..

이럴 일은 거의 없겠죠? 사용자가 직접 검색 파라미터에 대해 한글을 입력할 필요는 없으니까요.

우리는 프로젝트 진행 시 UTF-8로 한다면 위와 같이 셋팅 후 GET방식에 대한 파라미터 중 한글 파라미터가 들어올 수 있

는 상황에 대해서 UTF-8로 인코딩 한 후 JSP에 내보내야 한다는 것 입니다. java.net.URLEncoder.encode 메소드를

통해서 말이죠.

또 있습니다.

익스플로러6에서는 <a href="/?stone=돌">A태그 한글넘기기</a> 이 것 또한 깨집니다.

그러므로 더욱 더 위와 같이 UTF-8로 인코딩 한 후 내보내야겠죠.

<a href="/?stone=%EB%8F%8C">A태그 한글넘기기</a> 이렇게요.

 

EUC-KR 했을 경우의 결과는?

위와 같이 하고 모든 캐릭터셋을 euc-kr 했을 경우는 좀 편해 집니다.

UTF-8 일 경우 '돌'을 브라우저에서 처리하는 URL 인코딩을 했을 땐 '%EB%8F%8C' 이렇게 보였던 것이

EUC-KR 일 경우는 '%B5%B9' 이렇게 되죠.

또 위의 UTF-8일 경우 중요내용 이었던 문제가 모두 해결 됩니다. URL입력창에서 한글파라미터 선택 문제,

익스플로러6 문제가 모두 해결 되죠.

 

정리

웹 프로젝트 진행 시 캐릭터셋에 대한 결정은 중요하지만 소홀한 듯 싶습니다.

디자이너의 몫은 <meta http-equiv="Content-Type" content="text/html; charset=euc-kr"> 이 부분 일지 모르지만

개발자는 위에서 본 내용처럼


필터를 만들어야할 상황

WAS의 설정파일을 수정해야할 상황

JSP파일내서 처리해야할일들

브라우저의 영향 등..

체크해야될 게 많아지죠. 개발 시 한글 파라미터들이 깨지는 일이 빈번 합니다.

개발 진행 전 캐릭터셋을 정해 한글 파라미터에 대한 위와 같은 방법들을 공유 해야 할 것 입니다.

수 많은 A태그와 서로 다른 한글처리로 인해 문제가 생기면 일정에 차질이 생기겠죠..?

euc-kr이 아닌 utf-8로 개발된 사이트들이 IE6에서 한글파라미터를 그대로 GET으로 넘겨 한글이 깨지는 경우가 있어요.


아직 국내에서는 IE6사용자가 많다는 걸 잊지 말아야 합니다.

웹 프로젝트도 euc-kr 보다 utf-8로 개발되는 사이트들이 늘어나고 있으니 더 신경써야겠죠.

UTF-8에서 한글처리에 대한 신경을 안 쓰고 싶다면 POST로 넘기는 방법이 있습니다. 검색에 대한 처리들을 POST로

하는 거죠. 하지만 POST로 넘겼을 시 페이징처리, 페이지 이동 등 스크립트로 서브밋을 날려야 하는 개발이 필요합니다.

 


웹접근성에서는 스크립트의 사용을 최소화하길 바라죠.

스크립트 사용을 안쓰기엔 많은 고통이 따릅니다.. 기본적인 CRUD 에 대한 처리만 해도 피곤하거든요.

또한 POST로 구현 시 URL에 파라미터값이 남지 않아 즐겨찾기가 무용지물이 되버리죠. 검색 후 사용자가 즐겨찾기하고

싶은 페이지가 쓸모 없어지는 거죠. 이 부분은 중요한 것 같습니다. 사용자가 원하는 자료를 즐겨찾기하는 건 당연히 될꺼라고 생각 될테니까요. 그러므로 개발할 때 데이터전송에 대해 POST, GET 방식을 구분지어 개발 하여야 겠죠?

입력창이라면 POST고, 검색 및 페이지 이동은 GET 이어야 할 것입니다.

 

 

 

 

이상 짧은 경험담을 적어 봅니다. 역시 개발자는 알아가야할 게 끝도 없습니다.