Backend/Java

[JSP] 한글 인코딩

비비빅B 2020. 5. 28. 17:45

한글 출력 기본 원칙

인코딩과 디코딩할 때 chatset 을 맞춰서 해야함
  • 보통 jsp파일에 바로 한글 쓰는 것은 문제되지 않음
  • 디렉티브 태그 setContentType과 pageEncoding에서 인코딩과 디코딩을 처리해줌
  • 그러나 url로 넘기거나 request로 다른 jsp파일로 값을 넘기는 경우에는 다름
  • 인코딩과 디코딩을 직접 지정해줘야함

Base64

java.util.Base64
response.sendRedirect("main.jsp?name="+Base64.getEncoder().encodeToString("홍길동".getBytes()));
// http://localhost:8080/jspwork/ch05_1/main.jsp?name=yKux5rW/
// main.jsp
<% String s_name = request.getParameter("name"); %>
<%= s_name %> 님 안녕하세요!		// yKux5rW
<br>
<%= Base64.getDecoder().decode(s_name) %> 님 안녕하세요!	//[B@7b1b59ba 
<br>
<%= new String(Base64.getDecoder().decode(s_name), "euc-kr") %> 님 안녕하세요!	// 홍길동

  • html에서 url로 값 넘기기 전에 Base64 인코더를 이용함
  • 스트링 기본 바이트 배열을 변수에 넣음
  • 인코딩 된 값을 url로 넘김
  • 출력페이지에서 Base64디코더로 바이트 배열 받음
  • String 생성자를 이용해 바이트배열을 euc-kr로 디코딩

URLEncoding

java.net.URLEncoder
response.sendRedirect("main.jsp?name="+ URLEncoder.encode("홍길동", "euc-kr"));
<% String s_name = request.getParameter("name"); %>		
<%= s_name %> 님 안녕하세요!	// ??±æ?¿
<br>
<%= s_name.getBytes("8859_1") %> 님 안녕하세요!	// [B@2dff8011
<br>
<%= new String(s_name.getBytes("8859_1"), "euc-kr") %> 님 안녕하세요!	// 홍길동

  • html에서 url로 값 넘기기 전에 URL인코더를 이용함
  • euc-kr로 인코딩
  • 출력페이지에서 8859_1로 바이트배열 받음
  • 바이트 배열 euc-kr로 디코딩

  • 왜 중간에 8859_1로 바이트 배열을 받는가?
  • getParameter로 인코딩 값을 받는 도중에 프로그램에서 값을 바꿈
  • 인코딩한 값을 톰캣이 자동으로 8859_1로 디코딩함
  • 그래서 디코딩돼서 깨진 값을 8859_1 바이트 배열로 원상복귀하고
  • 그걸 다시 euc-kr로 디코딩하는 것
<% String s_name = request.getParameter("name"); %>
<%= s_name %> 님 안녕하세요!	// ??±æ?¿
<br>
<%= URLDecoder.decode("%C8%AB%B1%E6%B5%BF", "8859_1") %> 님 안녕하세요!	// ??±æ?¿
<br>
<%= new String(s_name.getBytes("8859_1"), "euc-kr") %> 님 안녕하세요!	// 홍길동
<br>
<%= URLDecoder.decode("%C8%AB%B1%E6%B5%BF") %> 님 안녕하세요!	// 홍길동


setCharacterEncoding

response.sendRedirect("main.jsp?name="+"홍길동");

 

<% request.setCharacterEncoding("euc-kr"); %>
<% String s_name = request.getParameter("name");%>
<%= s_name %> 님 안녕하세요!

 

  • request 인코딩 방식을 직접 지정(제일 간단한 방법)
  • 출력 페이지에서 request를 받을 때 euc-kr로 인코딩하는 것
  • 페이지에 로드될 때 페이지 디코딩 또한 euc-kr이므로 잘 출력 됨
  • 다만 여기서는 request 내부적으로 값을 넘겨주는 것이 아닌
  • url 쿼리스트링에 강제로 넣었기 때문에 한글은 빈값으로 넘어와서 쓸 수 없음

url에 비어있는 name 값