DJ메탈짱™의 Free Style

Jsp 페이지의 한글 인코딩 문제 (UTF-8), encodeURIComponent, URLDecorder, getBytes() 본문

일(job)/JAVA

Jsp 페이지의 한글 인코딩 문제 (UTF-8), encodeURIComponent, URLDecorder, getBytes()

뽀&쏭 2016. 1. 22. 17:30

 

 

jsp에서 팝업창으로 한글값을 던질때 encodeURIComponent로 인코딩하여 전달하고,

서블릿으로도 문제없이 넘기고 있다고 생각했는데, 실제 컨트롤러(?)를 지나고 오면
디코딩이 되지 않고 한글이 깨져서 나옴.

1. 팝업창의 서블릿에서 아래와 같이 Character를 설정 해줘도 깨짐 request.setCharacterEncoding("euc-kr");

2. URLDecoder도 여전히 깨짐.
URLDecoder.decode(한글)

3. 결과적으로 아래와 같은 방법으로 해결되었고, 펌글의 상세한 내용을 참고하면 되겠음.
String std_nm = map.getString("std_nm");
std_nm = new String(std_nm.getBytes("8859_1"), "UTF-8");


1) GET 요청시 한글 URL 오류.

예를들어 다음과같이 (localhost:8080/2013/자바지기) 요청이 있다고 가정합니다.
spring controller메소드에서 @Pathvariable 로 사용하는 url value를 한글로 사용할 경우,
controller메소드에서 전달받은 데이터 인코딩값이 깨지게 됩니다.


@RequestMapping("/{class1}/{professor}")
public String lecture_detail(@PathVariable String professor) {
//professor 데이터 인코딩 깨짐
}

이 문제는 tomcat 요청시 별다른 파라미터 전달이 없을경우 (header의 encoding setting 요청이 없을경우)
톰캣의 기본인코딩 설정인 8859_1형태로 인코딩되어 발생합니다.
저같은 경우에는 Spring 프로젝트의 web.xml에 encodingFilter를 UTF-8로 설정하였기 때문에
위 메소드의 파라미터로 전달받는 데이터는 8859_1인코딩 + Spring에 설정된 UTF-8인코딩 된 데이터가 전달되게 됩니다.
그러므로 정상적인 데이터를 확인하기 위해서는 아래와 같이 디코딩을 2번해야지만 정상적인 한글이 출력되게 됩니다.


URLDecoder.decode((URLDecoder.decode(param, "8859_1")), "UTF-8"); //방법1
new String(param.getBytes("8859_1"), "utf-8"); //방법2

출처 : http://slipp.net/questions/254