블로그 이미지

카테고리

데꾸벅 (194)
Publisher (39)
Scripter (97)
Programmer (1)
Designer (30)
Integrator (18)
Pattern Searcher (4)
News (2)
강좌 및 번역 (3)

최근에 올라온 글

최근에 달린 댓글


간혹가다 프로젝트를 하다가 보면 한글 캐릭터셋, 인코딩 때문에 많이 헷갈릴때가 있다.
이번에 강의자료를 만들다가 데꾸벅의 블로그 RSS를 JSP로 Proxy를 만들기 위해 HttpClient라이브러리를 가져오기 위해 UTF-8로 가져왔는데 실제 RSS파일은 UTF-8로 헤더파일에 기재되어 있었으나 ISO8859-1로 가져와야 했다.

<%@ page language="java" pageEncoding="utf-8" %>
<%@ page import = "org.apache.commons.httpclient.HttpClient" %>
<%@ page import = "org.apache.commons.httpclient.methods.GetMethod" %>
<%@ page import = "org.apache.commons.httpclient.HttpStatus" %>
<%
 request.setCharacterEncoding("utf-8");
 String url = "http://techbug.tistory.com/rss";

 HttpClient client = new HttpClient();
 GetMethod method = new GetMethod(url);

 try {
  int statusCode = client.executeMethod(method);

  out.clearBuffer();
  response.reset();

  response.setStatus(statusCode);

  if (statusCode == HttpStatus.SC_OK) {
   String result = method.getResponseBodyAsString();
   response.setContentType("text/xml; charset=iso8859-1");
   out.println(result);
  }
 } finally {
  if (method != null) method.releaseConnection();
 }
%>



extjs의 한글 로케일 파일을 설정해줄때도 해외에 거주하는 개발자들에게 문의는 적었으나 국내에서 개발하는 개발자들의 불만이 상당히 많았다. js파일을 UTF-8로 인코딩 해 놓았으니 해당 내용안의 한글이 모두 깨어져 스크립트 에러가 떨어진다는 것이였다.이럴때는 다음과 같이 처리 해준다.

<script type="text/javascript" charset="utf-8" scr="로케일파일.js" ></script>

또한 form submission시 캐릭터셋을 처리할때 모질라 계열에서는 accept-charset을 해주면 되지만 익스플로러에서는 아예 무시해 버린다.. 이때는 자바스크립트를 사용하여 다음과 같이 해주면 된다
아래소스는 prototype.js를 이용한 예제이다.

function send() {
    var f = $('frmTest');
    if (Prototype.Browser.Gecko)  //Firefox일 경우
        f.acceptCharset = 'euc-kr';
    else
        document.charset = 'euc-kr';
    f.submit();
    if (!Prototype.Browser.Gecko) //Firefox가 아닌 경우
        document.charset = 'utf-8';
}

 

 

 

문자셋 (charset, Character Set)

하나의 언어권에서 사용하는 언어를 표현하기 위한 모든 문자(활자)의 모임을 문자셋(charater set)이라고 한다.
다시 말하면 우리가 얘기하는 언어를 책으로 출판할 때 필요한 문자(활자)를 모두 모은 것이라고 생각하면 된다. 추가적으로 부호와 공백 등과 같은 특수 문자도 문자셋에 포함된다.
영어의 경우 알파벳 대소문자와 특수 문자 등으로 간단하게 문자셋을 구성할 수 있지만 한글의 경우 출판에서 가,나,다 등으로 출판함으로 훨씬 다양한 문자셋을 가지고, 또한 한자를 병행해서 사용함으로 문자셋의 범위는 더욱 넓어진다.
추상적인 글자 셋은 여러 개의 인코딩을 가질 수 있다. MIME 문자셋은 IANA에서 정의하며 인터넷 및 XML 파일에서 사용한다.

 

인코딩 (encoding)
인코딩은 문자셋을 컴퓨터가 이해할 수 있는 바이트와 매핑하는 규칙이다.
예를 들면 ASCII Code에서 A,B,C 등은 문자셋이고 A는 코드 65, B는 코드 66 등 바이트 순서와 매핑한 것이 인코딩이다. 따라서 문자셋을 어떻게 매핑하느냐에 따라 하나의 문자셋이 다양한 인코딩을 가질 수 있다. 

대부분의 인코딩에서는 대소문자를 구분하지 않는다.
대한민국 문자셋(charater set)에서 가장 많이 사용하는 인코딩은 "UTF-8", "KSC5601", "ISO-8859-1" 이다.


문자셋(인코딩)의 예

  • 한글 : 8bit KSC5601 (8bit EUC-KR, 7bit ISO-2022-KR, ISO-2022-Int)
  • 영문 : KSC5636, US-ASCII (둘 간의 차이는 화페 단위 뿐)
  • 한글+영문 : KSC5861 (EUC-KR), KSC5636 + KSC5601를 모두 포함한다.
  • 유니코드 : 4byte Unicode < ISO-10646 UCS (ISO-8859-1, UTF-8, UTF-16)

문자셋과 인코딩은 동일한 명칭을 가질 수 있어 서로 혼용하여 사용되는 경우가 많다.

  • EUC-KR은 원래 유닉스용 표준이었는데 인터넷으로 확장되어 사용된다.
  • KSC5601은 인터넷에서 원활한 한글(완성형) 사용을 위하여 정의된 표준이다.
  • EUC (Extended UNIX Code), UTF (UCS Transformation format)


기본 인코딩

Windows : 시스템 언어와 관련된 코드 페이지를 따름

  • 영문 Windows는 CP1252 인코딩을 사용
  • 한글 Windows는 MS949 인코딩을 사용

 

Unix : LANG 환경 변수로 지정된 로케일에 해당하는 인코딩

  • Solaris는 LANG 환경 변수가 ko, ko_KR일 경우 EUC-KR 인코딩을 사용
  • HP는 LANG 환경 변수가 ko_KR, ko_KR.eucKR일 경우 EUC-KR 인코딩을 사용
  • Unix에서 locale -a 명령을 사용하여 LANG 환경 변수에 지정 가능한 문자셋을 확인할 수 있다.

HTML : ISO-8859-1와 ISO-10646
XML : UTF-8
웹 브라우져 : 내부적으로 모두 유니코드로 처리를 한다.
HTTP/1.0 : ISO-8859-1
HTTP (URL,URI) : US-ASCII, %hexadecimal_code, JavaScript escape() 함수 사용
Java : 유니코드 2.0
직렬화된 Java Class : UTF-8
J2EE : ISO-8859-1
Oracle : UTF-8 (AL32UTF8), 한국에서는 KSC5601 (KO16KSC5601)

 


다양한 환경에서 인코딩 설정


웹 브라우져 설정

"도구 -> 인터넷 옵션 -> 언어" 메뉴를 선택한다.
영어[en]와 한국어[ko]를 추가하고 원하는 언어를 가장 상단에 위치한다.

JVM 설정
일반적으로 LANG 환경 변수를 설정해 주면 자동으로 설정이 된다.

locale -a : Solaria unix 명령어로 지원 가능한 encoding을 확인한다.
env  LANG  ko : csh에서 Encoding을 설정한다. (KSC5601, EUC-KR)
LANG=ko : ksh에서 Encoding을 설정한다. (KSC5601, EUC-KR)

JVM 옵션 설정 (UTF-8, ISO-8859-1, KSC5601)

        -Dfile.encoding=8859_1 :필수 항목
        -Dfile.client.encoding=8859_1

JSP를 사용하여 JVM 옵션 확인 (encoding.jsp)

        file.encoding = <%= System.getProperty("file.encoding") %><br>
        file.client.encoding = <%= System.getProperty("file.client.encoding") %><br>
        client.encoding.override = <%= System.getProperty("client.encoding.override") %><br>

HTML 설정 : HTML 파일을 UTF-8로 만들어 저장한다.

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


XML 설정
    XML 파일을 UTF-8로 만들어 저장한다.

    <?xml version="1.0" encoding="UTF-8" ?>

JSP 설정
    JSP 파일을 UTF-8로 만들어 저장한다.

    <%@ page pageEncoding="UTF-8" %>
    <%@ page contentType="text/html;charset=UTF-8" %>

Servlet 설정

    HTTP 요청의 인코딩 지정
    request.setCharacterEncoding("UTF-8");
    HTTP 응답의 인코딩 지정
    response.setContentType("text/html; charset=UTF-8");

web.xml 설정

    <mime-mapping>
        <extension>html</extension>
        <mime-type>text/html;charset=UTF-8</mime-type>
    </mime-mapping>

 



 참고자료

 

 

 

Post by 넥스트리소프트 데꾸벅(techbug)
, |