Contents

System/OS
2013.04.23 16:22

[java] Tomcat/UTF-8 or All 지원 ㅎㅎ

조회 수 17059 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Tomcat/UTF-8 or All

아래(하나, 둘, 셋 - 5.X)와 같이 하면, JSP에 어떠한 코드를 넣지 않아도 UTF-8을 마음대로 사용가능.
물론 EUC-KR만 사용하길 원한다면 UTF-8을 EUC-KR로 바꾸기만 하면 그만!!

Test 환경 
- Tomcat : 5.0.28
- JDK : J2SE 1.4.X
- DB : MySQL4.1.X (DB가 UTF-8을 사용하도록 설정)
- JDBC Driver : mysql-connector-java-3.1.11-bin.jar
(jdbc:mysql://localhost/warmpark?characterEncoding=UTF-8)


하나. JSP Page설정
<%@page pageEncoding="UTF-8"%> : 페이지에 직접 입력된 한글 및 중국어 등을 인식하기 위해 필요


둘. Tomcat's %TOMCAT_HOME%\config\server.xml 의
   <Connector .../> 부분 모두 편집(URIEncoding="UTF-8" 추가).
- Get 방식으로 전달되는 파라미터 인코딩 (Tomcat5.X때 반드시 필요)

<Connector port="8080"
               URIEncoding="UTF-8"
               .../>


셋. streaming(POST)방식으로 전달되는 파라미터 인코딩
 셋 대안 1. request.setCharacterEncoding("UTF-8")을 명시적으로 사용
 response.setCharacterEncoding("UTF-8)을 명시적으로 사용

 셋 대안 2.(추천) - Filter사용
 /** Java Source Code **/
package filter;
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharsetFilter implements Filter {
    private String encoding;

    public void init(FilterConfig config)
        throws ServletException {
        encoding = config.getInitParameter("requestEncoding");
        if (encoding == null)
            encoding = "UTF-8";
    }

    public void doFilter(ServletRequest request,
        ServletResponse response, FilterChain next)
        throws IOException, ServletException {
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);
        next.doFilter(request, response);
    }

    public void destroy() {
    }
}


<!-- web.xml에 등록 코드 -->
<?xml version="1.0" ?>
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

   ...

<!--CharsetFilter start-->
<filter>
  <filter-name>Charset Filter</filter-name>
  <filter-class>filter.CharsetFilter</filter-class>
  <init-param>
   <param-name>requestEncoding</param-name>
   <param-value>UTF-8</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>Charset Filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<!--CharsetFilter end-->

...

</web-app>


넷(선택사항). %TOAMCAT_HOME%bin\catalina.bat수정  java.exe를 시작할 때 -Dfile.encoding=UTF-8  -Dclient.encoding.override=UTF-8  을 사용하도록 수정
rem Execute Java with the applicable properties
if not "%JPDA%" == "" goto doJpda
  if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
    %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Dfile.encoding=UTF-8 -Dclient.encoding.override=UTF-8  -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
  goto end
  
  :doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Dfile.encoding=UTF-8 -Dclient.encoding.override=UTF-8  -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
  goto end

  :doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n %DEBUG_OPTS% -Dfile.encoding=UTF-8 -Dclient.encoding.override=UTF-8  -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
  goto end

  :doSecurityJpda
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n %DEBUG_OPTS% -Dfile.encoding=UTF-8 -Dclient.encoding.override=UTF-8  -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
  goto end


이하는 참고자료입니다. 


1. JSP pages must include the header: 
<%@ page contentType="text/html; charset=UTF-8" %> 


2. In the Catalina.bat (windows) catalina.sh (windows) apache$jakarta_config.com (OpenVMS), file there must be a switch added to the call to java.exe. The switch is: 
-Dfile.encoding=UTF-8 

I cannot find documentation for this environment variable anywhere or what it actually does but it is essential. 


3. For translation of inputs coming back from the browser there must be a method that translates from the browser's ISO-8859-1 to UTF-8. It seems to me that -1 is used in all regions as I have had people in countries such as Greece & Bulgaria test this and they always send input back in -1 encoding. The method which you will use constantly should go something like this: 
/**
  * * Convert ISO8859-1 format string (which is the default sent by IE * to
  * the UTF-8 format that the database is in.
  */ 
public String toUTF8(String isoString) { 
    String utf8String = null; 
    if (null != isoString && !isoString.equals("")) { 
        try { 
            byte[] stringBytesISO = isoString.getBytes("ISO-8859-1"); 
            utf8String = new String(stringBytesISO, "UTF-8"); 
        } catch(UnsupportedEncodingException e) { 
        }
    }
}

I have found that these three steps are all that is necessary to make your site accept any language that UTF-8 can work with. I extend my thanks to those of you on the Tomcat users list who helped me find these little gems. 

(from the tomcat-user mailing list) 

Alternative solution 

The solution suggested above works fine with steps (1) and (2) only, but from the architecture perspective the correct way is to add a filter to the Tomcat that will do necessary correction for the application deployed without any additional changes to the rest of the code. 

1. Make sure JSP header is set as suggested: 
<%@ page contentType="text/html; charset=UTF-8"%>


2. Example of filter: 
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class CharsetFilter implements Filter {
    private String encoding; public void init(FilterConfig config)
        throws ServletException {
        encoding = config.getInitParameter("requestEncoding");
        if (encoding == null)
            encoding = "UTF-8";
    }

    public void doFilter(ServletRequest request,
        ServletResponse response, FilterChain next)
        throws IOException, ServletException {
            request.setCharacterEncoding(encoding);
            next.doFilter(request, response);
            response.setCharacterEncoding("UTF-8");
    }

    public void destroy() {
    }
}

 
Corresponding portion of web.xml configuration will look like: 
<!--CharsetFilter START-->
<filter>
<filter-name>Charset Filter</filter-name>
<filter-class>CharsetFilter</filter-class>
<init-param>
  <param-name>requestEncoding</param-name>
  <param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Charset Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--CharsetFilter end-->
 

The suggested solution originates from  Sergey Astakhov (all texts are in russian) (sergeya@comita.spb.ru) 

last edited 2005-06-22 21:24:14 by Alexander Ivanyukovich

출처 : http://wiki.apache.org/tomcat/Tomcat/UTF-8

Tomcat/JSP와 한글 이미 okjsp에 잔뜩 올라왔던 내용인데요, 걍 총정리 차원에서 올려봅니다.

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>
설정 부분을 바꿔줘야만 한다.

<Connector port="8080" maxThreads="150" minSpareThreads="25"
  maxSpareThreads="75" enableLookups="false" redirectPort="8443"
  acceptCount="100" debug="0" connectionTimeout="20000"
  disableUploadTimeout="true" URIEncoding="euc-kr" />

위에서 URIEncoding="euc-kr" 부분이다.

결론적으로 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 형태를
갖추고 있어야만 한다

출처 : http://www.okjsp.pe.kr/bbs?act=VIEW&seq=57865&bbs=bbs4&keyfield=content&keyword=&pg=2

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
132 System/OS [mysql] MySQL server has gone away 에러 대응 hooni 2013.05.29 19640
131 System/OS Mac OS X - Apache+PHP+MySQL 환경 서버 hooni 2013.04.25 32030
130 System/OS [mysql] mysql user 생성시 ERROR 1364 hooni 2013.04.25 28899
129 System/OS 맥에서 파일공유 (윈도우,맥) file hooni 2013.04.25 37735
128 System/OS 맥북에서 MAC/윈도우 멀티부팅시 시간 설정 file hooni 2013.04.23 30238
127 System/OS [doc] 코코아 프로그래밍 for MACOS 관련 내 분량.. file hooni 2013.04.23 21145
126 System/OS [sql] insert into select 사용하기 hooni 2013.04.23 28056
125 System/OS [mac] 맥에서 APM(apache,php,mysql) 구성하기 hooni 2013.04.23 39402
124 System/OS [mac] 맥(OSX)에서 root 패스워드 설정하기 hooni 2013.04.23 22889
123 System/OS [mac] OSX(맥) 단축키 설명 ㅎㅎ file hooni 2013.04.23 29977
» System/OS [java] Tomcat/UTF-8 or All 지원 ㅎㅎ hooni 2013.04.23 17059
121 System/OS [windows] 최근 열어본 문서목록 안나오게 하는 방법 hooni 2013.04.23 25848
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 ... 17 Next
/ 17