일반 한글처리2

황제낙엽 2005.12.01 10:03 조회 수 : 424 추천:205

sitelink1  
sitelink2  
sitelink3  
sitelink4  
sitelink5  
sitelink6  
1. struts+velocity+hibernate 환경에서
velocity.properties 파일의 설정도 이상이 없는데 넘겨지는 파라미터의 일본어가 깨지는 경우
form의 method가 get인지 확인한다. get일 경우 일본어 처리가 다르게 이루어지는 것 같다. post로 바꿔준다.




============================================
(1) JSP 페이지내에서 한글문제 처리법
============================================
아래와 page Directive 속성을 euc-kr(또는 EUC_KR)로 지정하면 된다.


------------------------------------------------------
<%@ page contentType="text/html;charset=euc-kr" %>
-------------------------------------------------------
최근 정보에 따르면 euc-kr대신에 'MS949'(대문자로)를 쓰는 것이 좋단다.

참고; '*.jsp'가 아닌 순수 HTML(*.html or *.htm)파일일 경우
아래와 같이 HTML의 meta태그를 이용한다.(물론 default값이다)
----------------------------------------------------------------------
<meta http-equiv="Content-Type" content="text/html;charset=euc-kr">
----------------------------------------------------------------------
만일, OS(웹서버 말고)가 Win2k일 경우는
맨마지막의 'charset=euc-kr'대신에 'ksc-5601'로 지정한다.
즉 아래와 같다.
----------------------------------------------------------------------
<meta http-equiv="Content-Type" content="text/html;charset=ksc5601">
----------------------------------------------------------------------




========================================================
(2) HTTP로 전송된 것을 받을 경우 한글문제 처리법
========================================================
이 문제는 JSP Container마다 조금씩 다르게 처리해 줘야 한다.

준비운동 ;
한글을 지원하는 코드에는 euc-kr(또는 ksc5601)과 8859_1이 있다고 했습니다.
# euc-kr : jsp 페이지내에서 사용되는 한글 인코딩 방식.
# 8859_1 : input박스를 통해서 http로 전송되어서 request.getParameter()로 받을 때
저장되는 한글 인코딩 방식.

앞서 페이지 지령문에서 다음과 같이 지정했는데 문제가 일어나게 됩니다.

이 경우 페이지내에서 출력하고자 하는 인코딩형태는 euc-kr인데,
http를 타고 전송된 글은 8859_1로 인코딩되어 있기 때문에 한글이 모두 깨져버립니다.


------------------
해결책
------------------
그 해결방법은 8859_1로 전송되어 온 글을 euc-kr로 변환하는 것입니다.

일반적으로 받은 데이터를 코드 변환할 때는
String형의 값을 byte형으로 변환하는 getBytes()메소드를 기본적으로 이용한다.


원래 문; String name=request.getParameter("name"); //Resin일 경우 처리가 필요없다.
*******************************************************************
변경 후; String name=new String(request.getParameter("name").getByets("8859_1"),"euc-kr");
*******************************************************************

8859_1코드로 전송받은 글을 euc-kr코드로 변환해서 받고 있다.



==========================================
(3) MySQL에 저장할 경우 한글 문제 처리법
==========================================
DB저장시 한글 저장 문제가 발생하는 이유는
DB Server와 JSP가 사용하는 코드 체제가 다르기 때문입니다.

DB는 일반적으로 ASCII나 ksc5601코드 체계를 사용하고
JSP는 Unicode를 사용합니다.

-------------------------------------------------------------------
Class.forName(org.gjt.mm.mysql.Driver");
String URL="jdbc:mysql://localhost/myDB?useUnicode=true&characterEncoding=euc-kr"
Connection conn=DriverManager.getConnection("URL","user","password")
----------------------------------------------------------------------
jdbc부분중에서 빨강색으로 적힌 부분을 넣어 주도록 하자.
Tomcat이 아니라 Resin일 경우는 euc-kr이 아니라 ksc5601임에 유의하자



======================================
(4) Container에 따른 한글 문제 처리 요약
======================================
한글 처리 작업은 JSP Container에 따라 조금씩 다르며
해당 Container의 버전에 따라 차이가 있을 수도 있어
약간 복잡할 수도 있습니다.

====================================================================
1. Resin ; jsp내의 page 속성변경, 받을 경우 불필요, db저장시 ksc5601로
=====================================================================
이경우는 아래와 page Directive 속성을 euc-kr(또는 EUC_KR)로 지정하면 된다.

------------------------------------------------------
<%@ page contentType="text/html;charset=euc-kr" %>
-------------------------------------------------------
최근 정보에 따르면 euc-kr대신에 'MS949'(대문자로)를 쓰는 것이 좋단다.

다음에는 DB저장시 옵션을 euc-kr이 아닌 'ksc5601'로 준다.
-----------------------------------------------------------------------------------
String URL="jdbc:mysql://localhost/myDB?useUnicode=true&characterEncoding=ksc5601";
------------------------------------------------------------------------------------ㄴ

주의 ; http에서 전송 된 글을 받을 때 어떤 처리도 하지 않는다.


========================================================
2. Tomcat
========================================================
이 경우는 버전에 따라 다소 차이가 있음을 알아 두자.
물론 Resin처럼 page Directives 속성을 지정해 줘야 한다.

Tomcat은 http로 전송된 글을 받을 때 버전마다 차이가 있어 신경써야 합니다.

Tomcat 버전 3.0이하인 경우
---------------------------
이 버전의 톰캣은 값이 넘어 올때 8859_1형식이 아니라 Cp1252로 넘어 오기때문에 다음과 같이 처리한다.

String name = new String(request.getParameter("name".getBytes("Cp1252"),"EUC_KR");

Tomcat버전 3.1이상인 경우
---------------------------
이 버전은 8859_1로 넘어 옵니다.

String name = new String(request.getParameter("name".getBytes("8859_1"),"EUC_KR");



=============================
(5) 한글 처리 편하게 하기
=============================
여기서 알아 볼 것은 한글 변환을 편하게 하는 방법이다.
우리는 지금까지 한글을 euc-kr으로 변환할 때는
다음과 같은 형태로 객체를 생성하였다.

String u_name = new String(request.getParameter("u_name").getBytes(8859_1","euc-kr");

그런데 직접 소스를 입력해 본 사람이라면 알겠지만,
한글 코드 변환할 때마다 일일이 이렇게 길게 치는 것이
조금은 불편하다고 느꼈을 것이다.

그렇다면 아예 한글 코드 변환하는 기능을
메소드나 빈으로 만들어 사용하는 것이 조금은 수고를 덜어 줄 것이다.

우선 메소드로 만들어 사용하는 방법부터 보자...

방법1; 메소드(toEuckr)로 만들어 사용하기
------------------------------------------------------------------------
<%!
String toEuckr(String str) throws java.io.UnsupportedEncodingException
{
if(str != null) return new String(str.getBytes("ISO-8859-1","EUC-KR");
}
%>
---------------------------------------------------------------------------

String u_id = toEuckr(request.getParameter("u_id"));

한글을 포함한 문자열은 toEuckr() 메소드를 이용하여 처리한다.


방법2; class로 만들어 사용하기
----------------------------------------------------------------
makeKOR.java

import java.io.*;

public class makeKor
{
public static String toEuckr(String str) throws UnsupportedEncodingException
{
if(str != null) return new String(str.getBytes("8859_1","euc-kr");
}
}
----------------------------------------------------------------------

빈 사용법;
우선 makeKOR.java을 컴파일한 후(makeKOR.class가 생성)
사용할 때는 import를 이용해서 빈을 포함시킨다.
----------------------------------------------------------------
<%! import="makeKOR" contentType="text/html;charset=euc-kr"%>
<%
String u_name = makeKor.toEuckr(request.getParameter("u_name"));
%>
-------------------------------------------------------------------

--이상으로 두가지 방법이 있음을 알아 보았는데,
자기가 편한 방법을 이용하면 되겠다....^================^




=============================
(6) getByte()메소드 자세히 알기
=============================
사용형식; getByte(String enc)

(1)정 의 ; String을 매개변수로 주어지는 charset으로 변환.
(2)매개변수 ; US-ASCII, ISO-8859-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16등
(3)리턴 값 ; byte[]
(4)예외 상황; 발생되는 exception은 UnsupportedEncodingException이 있다.
이 exception은 'java.io.*'를 import해야 사용가능하다.


[ 전체적인 해결법 키 ]

String URL="jdbc:mysql://localhost/myDB?useUnicode=true&characterEncoding=euc-kr
뒤에 붙는 useUnicode=true&characterEncoding=euc-kr
이게 가장 중요한 세팅이었습니다..이거 하나가 되면
html -> jsp 로 값넘긴거 코드 변환하는거 빼곤 나머지는 거의 변환해 줄일이 없더라구여



----------------------------------------------------------------------------------------

추가로 tomcat5(윈도우기반)에서 velocity를 이용시에 위와 같이하면 한글처리에 문제가 없습니다. 그런데 파라메터를 넘기는 처리를 해보면 한글이 깨지는 경우가 발생합니다. 그럴때는
tomcat의 server.xml 에서 connect 부분에.. URIEncoding 추가
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="EUC-KR" />
이 부분까지 해주시면 모든 문제가 해결될겁니다.
단,한글문제는 OS와 기타설정에 영향을 받으므로 이와 같은 방법이 항상 옳다고 말씀드릴 수는 없단점 참고하세요.
http://www.jtop.org/jtop/view.php?id=ver3_apache_docs&no=10
----------------------------------------------------------------------------------------



참조 : http://www.okjsp.pe.kr/ QnA 한글처리
번호 제목 글쓴이 날짜 조회 수
63 J2SE 5.0 Tiger 에 관해서 황제낙엽 2006.02.16 375
62 Building an eBay Rich Client using the XUI Framework 황제낙엽 2006.01.13 369
61 Vector 와 ArrayList의 차이 황제낙엽 2006.02.15 479
60 Using RSS in JSP pages (Informa Project) 황제낙엽 2006.01.10 40802
59 달력만들기 황제낙엽 2005.12.22 636
58 Velocity의 GenericTools 에 있는 DateTool 황제낙엽 2005.12.21 452
57 StringTokenizer 예제소스 황제낙엽 2005.12.21 613
56 유니코드로 된 파일 이름을 인터넷 익스플로러에서 저장하는 방법 황제낙엽 2005.12.01 543
55 Date 클래스와 Calendar 클래스 사이에... 황제낙엽 2005.12.14 337
» 한글처리2 황제낙엽 2005.12.01 424
53 한글처리1 황제낙엽 2005.10.20 533
52 유니코드 관련 유틸 클래스 황제낙엽 2005.07.16 633
51 음력 계산 로직 황제낙엽 2005.07.16 448
50 서블릿 내장 객체 (Implicit Object) 황제낙엽 2004.11.12 473
49 java.text.SimpleDateFormat 클래스를 이용하여 java.util.Date 의 객체 생성시 초기화하기 황제낙엽 2004.10.03 538
48 서블릿에서 페이지출력 황제낙엽 2004.09.30 377
47 Web Server Page작성시 한글처리를 위한 참고사항 (자바서비스넷 링크문서) 황제낙엽 2004.05.27 558
46 서버페이지의 처리시 charset 설정 황제낙엽 2004.05.27 564
45 서버페이지 호출시 파라미터의 한글처리 황제낙엽 2004.05.27 361
44 forward & sendRedirect 황제낙엽 2004.03.09 545