1. 소개
UTF-8은 웹 응용 프로그램에서 사용되는 가장 일반적인 문자 인코딩입니다.
중국어, 한국어, 일본어를 비롯하여 현재 전세계에서 사용되는 모든 언어를 지원합니다.
아래는 UTF-8 구성을 보여줍니다.
2. Connector Configuration
커넥터는 특정 포트의 연결을 수신합니다. 모든 커넥터가 UTF-8을 사용하여 요청을 인코딩하는지 확인해야합니다.
TEMCAT_ROOT/conf/server.xml
의 모든 커넥터에 URIEncoding="UTF-8"
매개 변수를 추가합시다.
<Connector
URIEncoding="UTF-8"
port="8080"
redirectPort="8443"
connectionTimeout="20000"
protocol="HTTP/1.1"/>
<Connector
URIEncoding="UTF-8"
port="8009"
redirectPort="8443"
protocol="AJP/1.3"/>
3. Character Set Filter
커넥터를 구성한 후에는 웹 응용 프로그램이 모든 요청과 응답을 UTF-8로 처리하도록해야합니다.
CharacterSetFilter
라는 클래스를 정의 해 보겠습니다.
public class EncodingFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
filterChain.doFilter(request, response);
}
}
모든 요청과 응답에 적용되도록 필터를 응용 프로그램의 web.xml에 추가해야합니다.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.junseok.blog.config.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
또는
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
해석
아래는 characterEncodingFilter.java
파일 입니다.
.
.
.
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String encoding = getEncoding();
if (encoding != null) {
if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
request.setCharacterEncoding(encoding);
}
if (isForceResponseEncoding()) {
response.setCharacterEncoding(encoding);
}
}
filterChain.doFilter(request, response);
}
web.xml 에서 encoding 값을 주지 않으면 해당 필터는 동작하지 않습니다. encoding 값이 null 이 아닌 경우만 동작하도록 되어 있습니다.
web.xml 에서 forceEncoding 을 true로 설정한 경우 HttpServletResponse 에도 Encoding 설정을 해줍니다. forceEncoding 을 true로 설정하지 않은 경우 HttpServletRequest에 encoding 설정이 되어 있다면 filter에서는 encoding을 해주지 않습니다.
encoding 설정을 강제하고 싶고 HttpServletResponse 에도 인코딩 설정을 해주고 싶다면 init-param 에서 forceEncoding 을 true로 설정해 주세요.
4. Server Page Encoding
우리가 구성해야하는 웹 애플리케이션의 다른 부분은 Java 서버 페이지입니다. 서버 페이지에서 UTF-8을 보장하는 가장 좋은 방법은이 태그를 각 JSP 페이지의 맨 위에 추가하는 것입니다.
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
5. HTML Page Encoding
서버 페이지 인코딩은 JVM에게 페이지 문자를 처리하는 방법을 알려주지 만 HTML 페이지 인코딩은 페이지 문자를 처리하는 방법을 브라우저에 알려줍니다.
모든 HTML 페이지의 head 섹션에 이 <meta>
태그를 추가해야합니다.
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
실제 인코딩 설정
현재로서는 이것만 필요 함.
filter 없어도 됨.
meta 태그 없어도 됨.
jsp 파일에 아래 코드만 있으면 한글 안깨짐.
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
template(tiles).jsp 파일에도 있어야 하고, body쪽 해당 jsp 파일에도 있어야 한글이 안 깨진다.
- javascript 한글 문자
-
템플릿 jsp 파일에 없고 body 쪽 jsp에 있으면 íëì¤ê° 로 출력 됨.
-
템플릿 jsp 파일에 있고 body 쪽 jsp에 없으면 ???? 로 출력 됨.
-
둘 다 없으면 파람스값 이렇게 표시 됨.
- jsp el
-
템플릿 jsp 파일에 없고 body 쪽 jsp에 있으면 ??? 로 출력 됨.
-
템플릿 jsp 파일에 있고 body 쪽 jsp에 없으면 정상 출력 됨.
-
둘 다 없으면 ??? 이렇게 표시 됨.