반응형

JAVA 기반 WAS 개발시에 한글이 종종 깨지는 경우가 많다. 이런 경우 해결하기 위해 상당한 시간이 소요될 수 있다. 한글이 깨지는 원인이 여러 가지 있을 수 있어서 설정하는 부분도 여러군데이다. 

UTF-8 인코딩 방식을 기준으로 나름대로 정리. 


+ 한글이 깨질때...


1. 이클립스에서 소스(html, jsp, java 등) 저장시 인코딩 포맷을 UTF-8로 설정한다.

2. 받은 스트링을 byte []로 변환시 인코딩을 지정하지 않으면, 시스템 디폴트 인코딩으로 되어서 깨질 수 있다.

String str="한글테스트"; 
byte[] buf = str.getBytes() ;
byte[] buf2 = str.getBytes("UTF-8") ; // 이렇게 한다. ; UNICODE 스트링을 해당 타입으로 인코딩해 준다.

String str2 = new String(buf2, "UTF-8") ;     // 이렇게 받는다. UTF-8 형식으로 알고, 디코딩하라는 의미. (인코딩(변환)하는게 아님)

3. tomcat 서버 설정 (GET방식 안쓰면 안 해도 됨)
HTTP body의 입력 스트림은 기본으로 UTF-8을 이용하여 디코딩한다. 그러나, URL은 ISO-8859-1로 디코딩한다.
브라우저에서 폼 데이터는 기본적으로 UTF-8로 인코딩하므로 POST 전송해도 문제가 없는 것이다. 그러나, GET 방식이면 당연히 문제가 생긴다. 이를 한 번에 해결하려면 아래와 같이 URL 인코딩 방식을 변경해주면 가능하다.

server.xml에서 사용하는 포트 8080, 8443 등 Connector 부분에 URIEncoding을 지정한다.
<Connector port="8080" ... URIEncoding="UTF-8" />

아파치와 연결하기 위해 mod_jk를 사용한다면 아래와 같이 한다.
<Connector port="8009" protocol="AJP/1.3" URIEncoding="UTF-8" />

JSP상에서는 아래와 같이 사용하면 된다.
<a href="show.html?param= <%=java.net.URLEncoder("한글테스트", "UTF-8")%>"> link </a>

4. java에서 데이터 받는 부분 인코딩 설정을 한다.
doPost(HttpServletRequest request, ...) {
request.setCharacterEncoding("UTF-8") ;     // 한글 수신을 제대로 하기 위함. 이후 request 데이터 변수 사용.
}

응답시에는 
response.setContentType("application/json; charset=utf-8") ;
주의사항!!!! (강조!!!)
반드시 PrintWriter out = response.getWriter(); 전에 위의 설정을 해 줘야 한다. 순서가 바뀌면  동작하지 않는다... 

-JSP에서는 다음과 같이한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>


5. jdbc & mysql ; DB에 들어갈 때 깨지면 다음을 확인한다.

-java에서 mysql 접속시, 인코딩 방식 지정.
String url="jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8";
Connection con = DriverManager.getConnection(url, "id", "password") ;

-mysql에서 테이블 생성시 인코딩 지정.
CREATE TABLE tablename (
col VARCHAR(100)
) DEFAULT CHARSET=utf8 ;

또는
CREATE TABLE ...
()  COLLATE='utf8_general_ci'

ENGINE=InnoDB
AUTO_INCREMENT=40;


6. ajax에서 한글설정
        var jsonData1 = JSON.stringify ({
              CMDID: "LIST",
              logonid : logonid }) ;
       $.ajax( {
              url: "/servicetest/apitest",
              type: "POST",
              data : jsonData1,
              contentType : "application/json; charset=UTF-8" ,
              dataType : 'json',
              success : function(data) ...
           });

7. 시스템 (OS) 환경의 언어세팅 문제일 수 도 있다. (중요!)
톰캣을 실행할 때, 환경 변수의 설정 상태가 중요하다!.
profile에 LANG=ko_KR.eucKR
또는 톰캣 구동 스크립트 (catalina.sh 등)에 추가.



'Develop > Java' 카테고리의 다른 글

CentOS, tomcat 타임존 문제  (2) 2018.03.06
tomcat 외부라이브러리 경로 설정 및 톰캣 튜닝  (0) 2018.03.06
jqGrid(2) row(줄) 색상 변경/값 변경  (0) 2016.01.22
jqGrid (1)  (0) 2016.01.19
한글 인코딩 UTF8  (0) 2015.06.02

+ Recent posts