2009-05-31 3 views
7

나는 여러 텍스트 필드가있는 html 양식을 가지고 있습니다.JSP의 인코딩 문제

영어 문자 (내 경우 러시아어)를 제출하지 않으려 고하면 서버에 "읽을 수없는"문자열 (질문이 아닌 "???"이지만 이상한 문자)이 수신됩니다.

은 난 여기가 보여 내 코드를 단순화 :

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<html> 
    <head><title>Simple jsp page</title></head> 
    <body> 
    <c:out value="${param.rustext}"/> 
    <form action="/test" method="post"> 
     <input type="text" name="rustext" width="30"> 
     <input type="submit" value="Submit"> 
    </form> 
    </body> 
</html> 

내가 그 문제를 해결하는 방법?

+2

을 web.xml에 추가 페이지 헤더는 실제로 인코딩으로 UTF-8 전송하고 있습니까? 피들러와 같은 것으로 확인하십시오 –

+0

그리고 그렇지 않은 경우 어떻게해야합니까? – Roman

답변

8

Tomcat은 URL이 포함 된 페이지의 인코딩과 관계없이 URL 매개 변수의 기본 문자 인코딩으로 ISO-8859-1을 사용합니다. 이것은 "URIEncoding" attribute in its Connector 구성으로 변경할 수 있습니다. 다른 응용 프로그램 서버는 비슷한 설정을 가질 수 있습니다.

This article은 JSP로 작업 할 때 일반적으로 발생하는 많은 문제를 다룹니다.

+0

예, 저는 Tomcat을 사용합니다. 링크를 가져 주셔서 감사합니다, 거기에 뭔가 유용한 것을 찾으려고 노력할 것입니다. – Roman

+0

URIEncoding 속성에 대한 자세한 내용은 http://tomcat.apache.org/tomcat-5.5-doc/config/http.html을 참조하십시오. – erickson

+1

이 답변은 * 실제로 * 잘못되었습니다. OP는 GET이 아닌 POST를 사용하고있었습니다. – BalusC

0

인코딩을 사용해야하는 POST를 사용할 때 양식은 콘텐츠 유형 "application/x-www-form-urlencoded"로 전송됩니다. form-attribute accept-charset = "UTF-8"을 지정하여 인코딩을 지정할 수 있습니다.

+0

이미 시도했지만 작동하지 않습니다. – Roman

3

에릭슨 (Erickson)은이 페이지에서 매우 잘 설명했습니다. 서버 독립적 인 솔루션은 문자 인코딩 필터 인 org.springframework.web.filter.CharacterEncodingFilter를 사용하는 것입니다. 해당 섹션에 필터 선언과 필터 URL 매핑을 추가 web.xml에

import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 

public class EncodingFilter implements Filter { 
    private String encoding = "utf-8"; 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain filterChain) throws IOException, ServletException { 
     request.setCharacterEncoding(encoding); 
     filterChain.doFilter(request, response); 
    } 
    public void init(FilterConfig filterConfig) throws ServletException { 
     String encodingParam = filterConfig.getInitParameter("encoding"); 
     if (encodingParam != null) { 
      encoding = encodingParam; 
     } 
    } 
    public void destroy() { 
     // nothing todo 
    } 
} 

: 아래의 예를 참조하십시오 빅터 Ionescu 제안으로

<filter> 
    <filter-name>EncodingFilter</filter-name> 
    <description> 
    <![CDATA[Changes the encoding of the request, in order to help the appserver to correctly interpret request params]]> 
    </description> 
    <filter-class>com.mypackage.EncodingFilter</filter-class> 
<init-param> 
    <param-name>encoding</param-name> 
    <param-value>ISO-8859-15</param-value> 
    </init-param> 
</filter> 


    <filter-mapping> 
     <filter-name>EncodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
+0

요청 URL이 아닌 요청 본문 만 다루고 있습니다. 즉, POST 요청에 대한 인코딩을 설정하고 GET 요청에는 인코딩을 설정하지 않습니다. GET 요청의 경우, 에릭슨 (Erickson)의 대답에 설명 된대로 서블릿 컨테이너의 설정을 수정해야합니다. – BalusC

+0

맞아요, URL에 대해 생각하지 않았습니다. –

0

이것은 동일하지만, 당신은하지 않습니다 자체 인코딩 필터를 작성해야합니다.

는 다음 필터가

<filter> 
    <filter-name>charsetFilter</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> 
</filter> 

<filter-mapping> 
    <filter-name>charsetFilter</filter-name> 
    <url-pattern>*.admin</url-pattern> 
</filter-mapping>