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