2009-05-31 53 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

是你的网页标题实际发送UTF-8编码?检查一下像Fiddler – 2009-05-31 18:05:29

+0

如果他们不是,我该怎么办? – Roman 2009-05-31 18:21:48

回答

8

Tomcat使用ISO-8859-1作为URL参数的默认字符编码,而不考虑包含URL的页面的编码。这可以通过"URIEncoding" attribute in its Connector配置进行更改。其他应用程序服务器可能有类似的设置

This article涵盖了使用JSP时经常遇到的许多问题。

+0

是的,我使用Tomcat。感谢您的链接,我会尽力找到有用的东西。 – Roman 2009-05-31 18:41:46

+0

有关URIEncoding属性的详细信息,请参阅http://tomcat.apache.org/tomcat-5.5-doc/config/http.html。 – erickson 2009-05-31 19:19:08

0

当使用POST - 这是一个必须使用编码 - 表单被发送为内容类型“application/x-www-form-urlencoded”。您可以指定表单属性accept-charset =“UTF-8”来指定您的编码。

3

埃里克森在这个页面上很好地解释了这一点。独立于服务器的解决方案是使用字符编码过滤器,即àorg.springframework.web.filter.CharacterEncodingFilter。见下面的例子:

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 
    } 
} 

在web.xml中添加过滤器声明和过滤URL映射在适当的部分:

<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

这是一样的维克多·约内斯库提出的,但你不知道需要编写你自己的编码过滤器。

添加以下过滤器到web.xml

<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>