2 minute read

인코딩 요약

pageEncoding=”utf-8”%
💡 문서를 어떤 캐릭터 셋으로 작성할지 정하는 것

response.setContentType(“text/html;charset=utf-8”)
💡 contenttype 이 메소드는 브라우저에 표현할 때 어떤 캐릭터 셋을 사용할지 정하는 것

request.setCharacterEncoding
💡 이 메소드는 서블릿에 사용된다. 서버측으로 데이터를 ‘요청’하게 되는데 이 때문에 request 객체를 사용하게 된다.

response.setCharacterEncoding
💡 이 메소드는 jsp출력에 사용된다. 즉 서버에서 브라우저로 데이터를 ‘응답’할 때 사용하는데 이 때문에 response 객체를 사용한다.

JSP 페이지 상단의 지시자

코드

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="ms949"%>
<!DOCTYPE html>
<html><head><meta charset="UTF-8"></head>
<body></body>
</html>

JSP 페이지 상단의 지시자
💡 jsp파일은 MS949로 작성되었으며 브라우저는 UTF-8로 받게될 것이다.

pageEncoding
💡 jsp파일의 캐릭터셋을 담당.
💡 jsp소스파일을 다른 환경에서 열람 등 할 때 소스의 상태를 관리하는 문장이다.

charset
💡 charset이 utf-8로 해야 정상출력되는걸 보아 크롬은 캐릭터셋이 UTF-8로 default세팅 되어있는걸 알 수 있다.
💡 charset=EUC-KR을 contentType 속성에 설정하면, 브라우저는 서버로부터 받은 데이터를 EUC-KR로 인코딩된 데이터로 해석하려고 시도한다.
💡 클라이언트가 서버로 데이터를 보낼 때도 해당 charset으로 데이터를 인코딩하여 전송한다.

html의 페이징 캐릭터 셋
다음으로 jsp파일 지시어 다음에 헤드에 들어오는 이 UTF-8은 html의 페이징 캐릭터 셋이다.

<meta charset="UTF-8">

💡 이미 위에서 <%@ pageEncoding%> 인코딩을 주었는데, 본문의 소스를 굳이 2번씩이나 인코딩해주어야 하나 싶다.
💡 찾아보니 jsp파일은 서블릿 변환되어 소스파일을 읽으므로 html 캐릭터셋보다 jsp캐릭터셋을 더 우선한다.
그러므로 상단 지시자에 charset이 선언되어 있으면 html부문의 meta charset은 무시된다.

소스파일 body에 사용되는 charset

이하 내용부터 설명한다.

CASE1. request.setCharacterEncoding(“UTF-8”);

request.setCharacterEncoding(“UTF-8”)
💡 jsp 혹은 html에서 작성된 폼 데이터를 전송할 때 UTF-8방식으로 전송하겠다는 뜻이다.

코드

<form name="form" action="test.jsp" method="post">
이름 : <input type ="text" name="name"/>
<input type ="submit" value="전송"/>
</form>

GET 방식 전송

GET 전송

 <form name="form" action="test.jsp" method="get">

💡 GET방식은 URL을 통해( UTF-8 세팅이 되어있는 톰캣을 거침) 캐릭터 셋 처리를 하기 때문에 톰캣이 세팅된 대로 처리된다.

✅해결방법1

wasadm@cddawso1:/ $ vi [WAS서버]/conf/server.xml 


<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" 
               URIEncoding="UTF-8"/>

POST 방식 전송

POST 전송

 <form name="form" action="test.jsp" method="post">

💡 글자가 깨진다면 데이터를 전송할 때 인코딩을 확인해야한다.
💡 문제의 원인은 서버로 전송된 데이터의 문자 인코딩과 서버에서 데이터를 처리할 때의 인코딩이 일치하지 않는 것이다.
💡 폼 데이터는 브라우저에서 기본적으로 UTF-8로 인코딩되어 서버로 전송된다.
💡 그러나 서버에서는 별도의 인코딩 설정이 없어서 서버에서 기본 인코딩으로 처리하게 된다.
💡 이 경우에는 서버의 기본 인코딩 설정에 따라 한글이 깨질 수 있다.

✅해결방법1
⭐ request.setCharacterEncoding(“UTF-8”); 코드 추가
⭐ 코드를 추가하여 서버로 전송된 데이터의 인코딩을 명시적으로 UTF-8로 설정
⭐ WAS서버측에 설정된 인코딩과 똑같이 셋팅하고 수행하면 된다.

<body>
<%
    request.setCharacterEncoding("UTF-8");
    String name = request.getParameter("name");
%>
이름은 <%= name %> 이다.
</body>

✅해결방법2
⭐ web.xml에서 필터 설정
⭐ web.xml 파일에 필터를 추가하여 서버로 전송된 모든 요청의 인코딩을 UTF-8로 설정

<filter>
<filter-name>encodingFilter</filter-name>
중략...

CASE2. response.setContentType(“text/html;charset=utf-8”)

response.setContentType(“text/html;charset=utf-8”)
💡 브라우저에 전송되는 데이터를 인코딩하는것
💡 브라우저에게 출력형식을 UTF-8로 표현하겠다고 선언하는 문장이다.

Leave a comment