Print
카테고리: [ Java ]
조회수: 13957

1. OS 레벨

1-1. OS 기본 Charset 설정 (Linux와 Unix)

 
1-2. Oracle JDBC-Thin Driver의 한글 지원
Oracle JDBC-Thin Driver의 경우에는 client-side의 환경과 상관없이 DB의 Character set이 “KO16KSC5601”로만 설정되어 있으면 한글을 이용하는 데 큰 문제가 없다. 앞에서도 언급했듯이, DB의 Character set이 “US7ASCII”나 “WE8ISO8859P1”이라면 JDBC Driver가 데이터를 무조건 UCS2로 변환시킨 후 이것을 Java program에 넘겨준다. 그러나, DB의 Character set이 “KO16KSC5601”이라면, 먼저 데이터를 “UTF8”으로 변환한 후 “UCS2”로 다시 변환해서 데이터를 java program에 넘겨주기 때문에 그 외 다른 환경 설정은 필요 없다. 단지 client-side의 prompt에서 한글을 입출력하기 위해서는 당연히 “LANG”변수를 한글을 I/O할 수 있는 값으로 설정을 해 주어야 하겠다. 
예를 들면 Solaris의 경우는 “export LANG=ko” 이고 Linux의 경우도 마찬가지로 “ko”로 설정을 해주면 된다.
 

1-3. JVM option 설정

 

1-4. String 인코딩 & 디코딩

인코딩시 utf-8로 하였다면 디코딩 할때도 역시 utf-8으로 해워야 문자가 깨지지 않는다. 인코딩과 디코딩을 쉽게 이해한다면 입력과 출력으로 생각하시면 좀더 쉽게 이해된다. 그 이유 때문에 utf-8로 인코딩된 문자를  euc-kr로 디코딩을 한다면 역시나 문자게 깨지게 된다. 
 

1-4-1. 인코딩

1-4-2. 디코딩

 

1-5. File 출력 인코딩

1-5-1.

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(File file), String charsetName));

1-5-2.

Charset charset = Charset.forName(String charsetName);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(File file), charset));

1-5-3.

Charset charset = Charset.forName(String charsetName);
CharsetEncoder encoder = charset.newEncoder();
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(File file), encoder));
 
참조문서 : 자바 1.4의 새로운 입출력, NIO API 2부 - Charset을 이용한 인코딩/디코딩처리 (http://javacan.madvirus.net/main/content/read.tle?contentId=77)
 
.......................중략.......................
Charset charset = Charset.forName("EUC-KR");
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), charset));
if(rset.isBeforeFirst()) {
 while (rset.next()) {
  StringBuffer line = new StringBuffer();
  for (int i = 0; i < colCount; i++) {
   String data = rset.getString(i+1);
   if (i != 0)
    line.append("|");
   line.append(data);
  }
  line.append("\n");
  out.write(line.toString());
 }
}
.......................중략.......................
.......................중략.......................
Charset charset = Charset.forName("EUC-KR");
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), charset));
if(rset.isBeforeFirst()) {
 while (rset.next()) {
  StringBuffer line = new StringBuffer();
  for (int i = 0; i < colCount; i++) {
   String data = rset.getString(i+1);
   if (i != 0)
    line.append("|");
   line.append(data);
  }
  line.append("\n");
  out.write(new String(line.toString().getBytes("UTF-8"), "UTF-8");
 }
}
.......................중략.......................

2. 톰캣 레벨

2-1. 톰캣 server.xml 파일에 uriEncoding="euc-kr" 설정 추가  (get 방식으로 넘겨주는 경우에만 해당)

<Connector 
port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000" 
               disableUploadTimeout="true"  [여기에추가] />
 

2-2. web.xml (context root 아래 WEB-INF 아래) 파일 수정

<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<!-- 추가 시작 -->
<init-param>
<param-name>javaENCODING</param-name>
<param-value>euc-kr</param-value>
</init-param>
<!-- 추가 끝 -->
<load-on-startup>3</load-on-startup>
</servlet>
 

2-3. 데이터를 읽어들이기 전에 

 request.setCharacterEncoding("euc-kr")
 response.setCharacterEncoding(String charset) 사용
 

2-4. javascript 에서 encodeURI(CONTENTS) 로 URL 인코딩

UTF-8 로 받아서, URLDecoder.decode 로 디코딩 해주니.. 깔끔하게 입력 되네요.
// 전송 javascript (XMLHttpRequest, POST 방식, ENCODING: UTF-8)
encodeURI(CONTENTS); // JavaScript 에서 URL 인코딩된 파라미터:CONTENTS 를 act.jsp 로 전송
// 입력처리 JSP 파일
request.setCharacterSet("UTF-8"); // request UTF-8 로 수신
String CONTENTS = java.net.URLDecoder.decode(request.getParameter("CONTENT")); // URL 디코딩
 

2-5. 톰캣 web.xml(context root 아래 WEB-INF 아래) 파일에 ENCODING filter 사용 (post 방식의 경우 body 인코딩)

 
<filter> 
  <filter-name>Set Character ENCODING</filter-name> 
  <filter-class>filters.SetCharacterENCODINGFilter</filter-class> 
  <init-param> 
   <param-name>ENCODING</param-name> 
   <param-value>EUC_KR</param-value> 
  </init-param> 
 </filter> 
 <filter-mapping> 
  <filter-name>Set Character ENCODING</filter-name> 
  <url-pattern>*.laf</url-pattern> 
 </filter-mapping> 
 
첨부된 파일 src 아래의 filters 경로 생성해준 뒤에 놓아줌.
 
6. charset 바꿔주는 방식 -  KSC5601는 euc-kr로 변경해주는 것 의미함
(new String(role.getString("userName").getBytes("8859_1"),"KSC5601"))