일반 한글처리2

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

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 한글처리
번호 제목 글쓴이 날짜 조회 수
347 java.util.Optional 에서의 map() 함수의 이해 황제낙엽 2026.06.24 666
346 linux(ubuntu) 의 jdk 21 이 설정된 환경에서 jdk 17 로 다운그레이드 절차 황제낙엽 2025.09.22 1532
345 [ChatGPT] javax.* 패키지와 jakarta.* 패키지의 혼합 사용 방안 황제낙엽 2025.04.15 2459
344 [ChatGPT] *.servlet.http.HttpServlet 클래스를 사용할 수 있는 주요 WAS 목록 황제낙엽 2025.04.14 2038
343 [ChatGPT] JDBC API에서 java.sql과 javax.sql 패키지의 차이점 황제낙엽 2025.01.31 2218
342 jakarta.servlet 패키지를 이용한 File Upload 구현 (2024.03.03, Servlet 5.0) 황제낙엽 2025.01.02 2310
341 [ChatGPT] Java EE가 Jakarta EE로 전환 황제낙엽 2025.01.01 2525
340 [ChatGPT] File.delete() 함수로 파일 삭제가 되지 않는 경우 황제낙엽 2024.12.10 2809
339 [ChatGPT] <jsp:include>에서 flush="true"를 설정시의 몇 가지 문제점 과 대안 황제낙엽 2024.07.19 2493
338 [Copilot] JSP, Servlet, web.xml, mysql 한글 설정 황제낙엽 2024.07.12 2555
337 Base64 클래스의 encode, decode 에서 URL-safe 황제낙엽 2024.07.10 2624
336 [Copilot] JSP 에서 다른 페이지를 현재 페이지에 포함시키는 문법 (include) 황제낙엽 2024.06.26 2570
335 Exception 출력에 대한 고찰 황제낙엽 2024.06.10 2198
334 google-auth-library-oauth2-http 라이브러리 다운로드 황제낙엽 2023.11.19 4025
333 firebase-admin-java 라이브러리 다운로드 (firebase admin sdk library) 황제낙엽 2023.11.19 2805
332 Enum 활용 (개인블로그, Effective Java) file 황제낙엽 2023.11.02 2759
331 Enum 활용 (우아한기술블로그) file 황제낙엽 2023.11.02 2790
330 servlet name 에 camel case 를 사용해서는 안되는 이유 황제낙엽 2023.10.24 2508
329 org.apache.commons.fileupload.servlet.ServletFileUpload 이용 예시 황제낙엽 2023.08.25 3336
328 ServletFileUpload.parseRequest() 실행 결과 리스트가 비어있는 오류 황제낙엽 2023.08.25 2935