ÃֽŠ°Ô½Ã±Û(OS/WAS)
2020.01.28 / 24:49

Charset Encoding °ü·Ã ¼³Á¤ ¹× ÀÚ¹Ù(Java)¿Í ÅèĹ

±îÄ¡¼³³¯
Ãßõ ¼ö 228

1. OS ·¹º§

1-1. OS ±âº» Charset ¼³Á¤ (Linux¿Í Unix)

  • locale ¸í·É¾î·Î ÇöÀç ¼³Á¤µÈ Charset È®ÀÎ
  • locale -a ¸í·É¾î·Î ¼³Á¤ °¡´ÉÇÑ charset ¸ñ·Ï È®ÀÎ
  • .profile(À¯´Ð½º) ³ª .bashrc(¸®´ª½º) ÆÄÀÏ¿¡ export LANG=ko_KR À̳ª ±âŸ ¿øÇÏ´Â charsetÀ» ¼³Á¤ÇØÁÜ
 
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 ¼³Á¤

  • -Dfile.encoding=EUC-KR 
 

1-4. String ÀÎÄÚµù & µðÄÚµù

ÀÎÄÚµù½Ã utf-8·Î ÇÏ¿´´Ù¸é µðÄÚµù ÇÒ¶§µµ ¿ª½Ã utf-8À¸·Î ÇØ¿ö¾ß ¹®ÀÚ°¡ ±úÁöÁö ¾Ê´Â´Ù. ÀÎÄÚµù°ú µðÄÚµùÀ» ½±°Ô ÀÌÇØÇÑ´Ù¸é ÀԷ°ú Ãâ·ÂÀ¸·Î »ý°¢ÇϽøé Á»´õ ½±°Ô ÀÌÇصȴÙ. ±× ÀÌÀ¯ ¶§¹®¿¡ utf-8·Î ÀÎÄÚµùµÈ ¹®ÀÚ¸¦  euc-kr·Î µðÄÚµùÀ» ÇÑ´Ù¸é ¿ª½Ã³ª ¹®ÀÚ°Ô ±úÁö°Ô µÈ´Ù. 
 

1-4-1. ÀÎÄÚµù

  • String.getBytes() - OS default charsetÀ¸·Î ENCODING
  • String.getBytes(String charsetName) - ¸í½ÃµÈ charsetÀ¸·Î ENCODING

1-4-2. µðÄÚµù

  • String(byte[] bytes) - OS default charsetÀ¸·Î decoding
  • String(byte[] bytes, String charsetName) - ¸í½ÃµÈ charsetÀ¸·Î decoding
 

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"))