Character Set과 Encoding 이해하기
간혹가다 프로젝트를 하다가 보면 한글 캐릭터셋, 인코딩 때문에 많이 헷갈릴때가 있다.
이번에 강의자료를 만들다가 데꾸벅의 블로그 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로 인코딩 해 놓았으니 해당 내용안의 한글이 모두 깨어져 스크립트 에러가 떨어진다는 것이였다.이럴때는 다음과 같이 처리 해준다.
또한 form submission시 캐릭터셋을 처리할때 모질라 계열에서는 accept-charset을 해주면 되지만 익스플로러에서는 아예 무시해 버린다.. 이때는 자바스크립트를 사용하여 다음과 같이 해주면 된다
아래소스는 prototype.js를 이용한 예제이다.
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 환경 변수를 설정해 주면 자동으로 설정이 된다.
env LANG ko : csh에서 Encoding을 설정한다. (KSC5601, EUC-KR)
LANG=ko : ksh에서 Encoding을 설정한다. (KSC5601, EUC-KR)
JVM 옵션 설정 (UTF-8, ISO-8859-1, KSC5601)
-Dfile.client.encoding=8859_1
JSP를 사용하여 JVM 옵션 확인 (encoding.jsp)
file.client.encoding = <%= System.getProperty("file.client.encoding") %><br>
client.encoding.override = <%= System.getProperty("client.encoding.override") %><br>
HTML 설정 : HTML 파일을 UTF-8로 만들어 저장한다.
XML 설정
XML 파일을 UTF-8로 만들어 저장한다.
JSP 설정
JSP 파일을 UTF-8로 만들어 저장한다.
<%@ page contentType="text/html;charset=UTF-8" %>
Servlet 설정
request.setCharacterEncoding("UTF-8");
HTTP 응답의 인코딩 지정
response.setContentType("text/html; charset=UTF-8");
web.xml 설정
<extension>html</extension>
<mime-type>text/html;charset=UTF-8</mime-type>
</mime-mapping>
참고자료
'Integrator > U-LINUX' 카테고리의 다른 글
동적 호스트도메인 사용하기 (apache2+tomcat6.0) (1) | 2009.12.22 |
---|---|
Apache expires 설정으로 브라우저 캐시 (0) | 2009.01.29 |
리눅스용 소프트웨어 (0) | 2008.03.29 |
우분투에서 하드드라이브 추가하기 (2) | 2008.03.04 |
우분투 IP변경하기 (0) | 2008.03.04 |