Tomcat 한글
원문: http://blog.naver.com/utsman?Redirect=Log&logNo=110014144021
Tomcat/JSP와 한글
총 정리 차원에서...
Tomcat 한글 설정하기
일반적으로 웹 어플리케이션이 GET과 POST 방식으로 파라미터를 넘겨 받을 때 request.setCharacterEncoding()을 통한 문자셋 인코딩이 필요하다.
◎ Tomcat 4.x
단순히 JSP 혹은 서블릿의 최 상단에 request.setCharacterEncoding("euc-kr");을 하면 된다.
GET과 POST 방식에 상관없이 인코딩을 해준다.
◎ Tomcat 5.x
POST 방식은 request.setCharacterEncoding("euc-kr");로 계속 하면된다.
하지만 GET 방식은 server.xml의 설정 부분을 바꿔줘야만 한다.
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="euc-kr"/>
<Connector port="8009"
enableLookups="false" redirectPort="8443" debug="0"
protocol="AJP/1.3" URIEncoding="euc-kr"/>
위에서 URIEncoding="euc-kr" 부분이다.그리고 아래의 port="8009" 부분은 mod_jk를 이용해서 Apache와 Tomcat 5.x 를 연동할 때 URIEncoding="euc-kr"을 지정할 필요가 있다.
URIEncoding으로 지정할 경우, 만약 웹 어플리케이션이 EUC-KR과 UTF-8을 각 요청 별로 따로 처리할 필요가 있을경우 그에 대응할 수 없다. 대신, useBodyEncodingForURI="true"을 사용하면 Tomcat 4.x와 동일한 방식으로 즉, request.setCharacterEncoding() 값에 따라 GET/POST 방식 모두를 처리할 수도 있다. (참조 : http://tomcat.apache.org/tomcat-5.5-doc/config/http.html)
결론적으로 Tomcat 4.x와 Tomcat 5.x 는 모두 request.setCharacterEncoding()이 필요하다는 사실에는 변함이 없다.
◎ 한글 파라미터를 가진 링크를 만들 때
JSP페이지에서 링크를 생성할 때, 한글이 됐든 공백이나 특수문자를 가진 영어가 됐든, 순수하게 영어와 숫자, 밑줄 등으로만 이뤄진게 아닌 모든 파라미터를 넘길 때는 무조건 URLEncoding을 해야한다고 봐도 된다.
Web Container에 따라 URLEncoding을 안하고 넘겨도 작동하는 경우가 있는데, 동일한 웹 컨테이너라도 버전에 따라 한글을 제대로 인식하지 못하는 경우도 있고, 또 다른 컨테이너에서는 URLEncoding이 안된 한글을 전혀 인식하지 못할 수도 있다.
그러므로 무조건 표준을 따라서 java.net.URLEncoder.encode()메 소드를 사용해 인코딩해서 넘기도록 한다. 디코드 작업은 request.setCharacterEncoding()에 의해서 자동으로 이뤄지므로 해줄것이 없다.(Tomcat 3.x대- JSP Spec 1.1 -에서는 request.setCharacterEncoding()이 없으므로 String.getBytes()를 이용해 직접 디코딩을 해줘야만 했다)
◎ <%@ include file="test.jspf"%> 에서의 한글
위와 같이 test.jspf를 static include 할 경우에 test.jspf에 있는 한글이 모두 깨질 수 있다. test.jspf에도 한글 설정이 필요한데, 이 경우에는 test.jspf의 최 상단에 다음을 추가하면 된다.
<%@page pageEncoding="euc-kr"%>
static include : JSP 페이지를 컴파일하는 시점에 해당 jspf 파일의 내용을 문자열 그대로 현재 jsp에 삽입하여 컴파일 하는 것. static include 방식에서 include 되는 대상 jsp의 확장자는 .jspf로 하는 것이 표준이다. .jspf 는 단독 실행을 위한 것이 아니라 항상 다른 JSP에 포함되어 쓰이는 목적으로 만들어졌기 때문에 완전한 JSP의 형태를 갖추고 있지 않다.
<jsp:include page=""/> 이 방식은 동적 include 방식으로, JSP 페이지가 실행되는 중간에 page에 지정된 jsp를 실행한 결과를 삽입하는 방식이다. 이 방식에서는 include 되는 JSP 페이지가 원래부터 페이지 인코딩 정보 등을 포함한 완전한 JSP 형태를 갖추고 있어야만 한다.
...okJSP 추가 사항
※ 톰캣에서 한글문제 해결방법 ※
작성일 : 2005.10.26
-. 아햏햏, ?막? ? , 퀰, 휖 같은 문자를 파라미터로 입력 받는방법
-. 한글 이름으로 된 파일(그림파일)이 다운로드 되지 않는문제 해결
-. Oreilly에서 만든 MultipartRequest 에서 한글파일 이름 얻기
우선 KSC5601(EUC_KR)에서는 위와같은 문자를 표현할 수 없다.
1. server.xml 에서
useBodyEncodingForURI 옵션추가
URIEncoding이 값 있다면 아래와같이 UTF8로 변경한다.
(톰캣이 파일 관리시 내부적으로 UTF8을 사용하는것 같음)
<Connector ....
useBodyEncodingForURI="true"
URIEncoding="UTF8"/>
2. JSP출력 인코등은 MS949, HTML은 KSC5601 혹은 EUC-KR, MS949 로 한다.
JSP,HTML 다음과 같이 넣어준다...
<%@ page contentType="text/html; charset=MS949" %>
<TITLE>한글 테스트</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=KSC5601">
3. HttpServletRequest.getParameter(String)를 사용하기전에, 다음 코드를 미리 실행한다.
request.setCharacterEncoding("MS949");
이것은 아래와 같이 실행한 결과를 한것과 동일하다.
new String(request.getParameter("param1").getBytes("ISO8859_1"),"MS949")
4. com.oreilly.servlet.MultipartRequest 에서 한글 파일 이름 얻기
아래와 같이 생성자의 3번째 파라미터에 MS949를 입력한다.
MultipartRequest multi = new MultipartRequest(request, "c:\upload", (1024*1024*30), "MS949", new DefaultFileRenamePolicy());
Tag
tag는 게시물의 성격을 나타내는 키워드를 입력하는 공간입니다. login 후 사용하실 수 있습니다.
감사합니다. ^^kenu2005-10-26 20:41:31x
좋은 팁 감사합니다.
그런데, 이러한 방식이 좋은 결정일까요?
받아들이는 인코딩과 내보내는 인코딩이 다른데다, 특정 브라우저의 특별한 설정에 의존적이기도 하구요.
하려면 완전히 UTF-8로 이전하거나 아니면 EUC-KR혹은 MS949로 통일하고 한글과 특수문자 들어가는 부분은 request.setCharacterEncoding()과 URLEncoder.encoding()으로 처리하는 것이 옳다고 보는데요.(이럴경우 WAS특성 타는 것을 본적이 없는거 같습니다.. 아직은요..)
위와 같은 경우 WAS가 달라지면 어떤 현상이 생길지 예측이 안되네요..
자바 웹 어플리케이션은 WAS바꿔 들어가는게 비일비재한데...
다른분들은 어떻게 생각하시나요?
자바 웹 프로그래머라면 한글 문제로 골머리 앓아본적 한두번씩은 있을 텐데요...
권남2005-10-28 03:48:22x
http://enhydra.objectweb.org/doc/e6.2/developer/encoding.html#d0e35 문서에 의하면 URIEncoding은 useBodyEncodingForURI 에 의해 무시당하고 request.setCharacterEncoding()을 따르는군요...
그렇다면 실제로 저 설정은 동일한 GET과 POST에 대해 항상 동일한 인코딩을 사용하는 설정이고 URIEncoding은 아무 의미도 없는거네요..
흠... 에구 테스트 해봐야징... 일단, URIEncoding보다는 useBodyEncodingForURI="true"를 사용하는 것이 더 좋을 것 같네요.
새로운거 하나 알았습니다.권남2005-10-28 04:05:36x
톰캣문서 http://tomcat.apache.org/tomcat-5.0-doc/config/http.html 에 의하면, useBodyEncodingForURI보다는 URIEncoding 사용을 권장하는 것 같네요... --;
This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitely set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.권남2005-10-28 04:08:17x
이올린에 북마크하기



