상세 컨텐츠

본문 제목

EUC-KR로 표현할 수 없는 한글 처리

IT 세상

by 이현민 (지후지율아빠) 2009. 12. 9. 10:36

본문


일반적인 웹애플리케이션의 한글 입력 및 출력 절차는 다음과 같습니다.

1. 웹브라우저가 입력 웹페이지(html or jsp)를 연다.
2. <form>을 이용해서 한글데이타를 WAS에 전송한다
3. WAS에서는 2번단계에서 웹브라우저가 사용한 것과 동일한 캐릭터셋을 사용하여 데이타를 인코딩한다
4. 필요시 DB서버등의 backend 시스템과 데이타를 주고 받는다

1번 단계에서 웹브라우저가 여는 입력 페이지의 캐릭터셋이 바로, 2번 단계에서
request encoding에 사용되는 캐릭터셋이 됩니다. 즉, 입력 페이지의 캐릭터셋이
EUC-KR이라면, 웹브라우저가 한글데이타를 WAS로 전송할 때도 EUC-KR을 사용하여
보내게 됩니다.

그런데, 한글데이타에 EUC-KR로는 표시할 수 없는 문자가 들어 있다면, 웹브라우저는
(정확히 말하자면 Internet Explorer의 경우에 한합니다. FireFox등의 웹브라우저는
조금 다르게 동작합니다)이 문자를 decimal code로 변환해서 WAS에 전송합니다.

예를 들어, '커피숖'이라는 한글데이타를 EUC-KR로 보낸다면, 웹브라우저가
'커'와 '피'는 각각 EUC-KR에 해당하는 2byte 코드로, '숖'은 decimal code인
숖 로 변경해서 WAS로 보내는 것입니다. 이 경우, WAS에서는 웹브라우저가
보내 준 숖을 그대로 받게 되므로, 이 값을 로그에 출력해 보면 '숖'이 아닌
숖이 보이게 됩니다. 이는 WAS단이 아닌, 웹브라우저단에서 처리되는 것으로,
웹스피어뿐만아니라 Tomcat에서도 동일한 현상이 발생합니다.

그럼에도 불구하고 웹브라우저상에서는 '숖'이 정상적으로 보이는 이유는, 웹브라우저가
알아서 숖을 '숖'으로 해석하여 보여 주기 때문입니다. 웹브라우저에서 페이지
소스를 확인해 보면, 실제로 WAS로부터 내려받은 response는, '숖'이 아니라
숖 임을 알 수 있습니다.

WAS단에서 숖은 하나의 char가 아니라 보이는 그대로의 String으로 처리됩니다.
따라서, 로그를 출력하거나, DB에 입력하거나 하더라도 '숖'이라는 하나의 문자로
처리되는 것이 아니라, 숖이라는 8글자의 String으로 처리되는 것입니다.

해결방법은 아래 두 가지 중 하나를 선택하면 됩니다.

a) 애플리케이션에서 decimal code를 다시 char로 변환하는 로직을 추가한다
b) 입력페이지를 포함한 모든 웹페이지의 캐릭터셋을 UTF-8로 변경한다

a안은, 예를 들어, &#49686을 다시 '숖'으로 변환하는 것입니다. 애플리케이션에서
49686이라는 int값을 char로 casting만 해 주면 쉽게 처리할 수 있습니다. 첨부파일중
StringConverter.java의 내용을 참고하셔도 되겠습니다.

ex)String kor=request.getParameter("kor"); //&#49686
if(kor!=null){
String convertedKor=StringConverter.convert(kor); //숖

문제는, 이렇게 변환된 '숖'이 EUC-KR 캐릭터셋을 사용하는 웹페이지에서 제대로
표시가 되지 않는다는 것입니다. 웹브라우저에서 페이지 소스를 확인해 보면,
'숖'도 아니고 &#49686도 아닌 garbage를 WAS로부터 받아 오는 것을 알 수 있습니다.
이것은 EUC-KR의 한계에서 비롯된 지극히 당연한 현상입니다.

해결을 위해서는 다소 복잡하지만, 화면표시를 위한 한글데이타는 &#49686을 그대로
사용하고, 로그 출력/DB입력 등의 용도로 사용할 때만 '숖'으로 변환해야 합니다.

b안을 선택하면, 애플리케이션 단의 변환이나 로직 추가는 전혀 필요없습니다. 단지,
웹페이지 소스중 아래 부분들만 변경해 주면 됩니다.

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<meta equiv="Content-Type" content="text/html; charset=UTF-8">

물론, JVM에 -Dclient.encoding.override=UTF-8 도 설정해 주어야 합니다.

웹브라우저에서 request를 보내는 단계에서부터 EUC-KR이 아닌, UTF-8을 사용하게
되므로, 처음부터 &#49686은 아예 등장하지도 않습니다. 또한, 응답 페이지에서도
캐릭터셋이 UTF-8이기때문에 '숖'이라는 문자를 표시하는데 아무 문제가 없습니다.

그러나, b안에서 고려해야 할 점은, 이렇게 입력받은 한글데이타를 DB서버등의
backend시스템과 공유하는 경우, backend시스템도 UTF-8을 지원해야만 한다라는
것입니다.
2008/09/21 02:03 2008/09/21 02:03
반응형

'IT 세상' 카테고리의 다른 글

window 배치파일 만들기 모든 정보  (0) 2009.12.09
window batch find  (0) 2009.12.09
결함많다던 YF 후배차 시승기  (0) 2009.12.04
tomcat context ROOT 변경하기  (1) 2009.11.17
nohup Command  (0) 2009.11.04

관련글 더보기