分享

彻底解决Tomcat 5.0.19的中文乱码问题

 Joshua 2006-01-16

一、Include的页面乱码


现象:include进来的页面出现乱码,其它页面正常。
原因:Tomcat在缺省情况下使用ISO-8859-1编码,但是在include时有时Tomcat不能正确根据外层.jsp文件的编码解析include进来的文件,造成include进来的文件中的中文乱码。
解决:这儿可以有很多解决办法,但是对于我们的中文环境,从根本上的解决办法是将Tomcat 5.0.19的核心缺省编码从ISO-8859-1修改为GBK 。可以在下面地址下载修改过的jar文件,
    右击保存
jasper-compiler.jar,jasper-runtime.jar位于/common/lib下,其它位于/server/lib下,将新的.jar文件替代原.jar即可。

二、提交的数据乱码


现象:通过表单提交的数据出现乱码。
原因:原因未明。可能是Tomcat在接收到请求后,并没有能够根据request中的信息提前正确的编码方式。
解决:可以添加一个设置字符集的Filter。

  1. package filters;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.UnavailableException;
  10. public class SetCharacterEncodingFilter implements Filter {
  11.     protected String encoding = null;
  12.     protected FilterConfig filterConfig = null;
  13.     protected boolean ignore = true;
  14.     public void destroy() {
  15.         this.encoding = null;
  16.         this.filterConfig = null;
  17.     }
  18.     public void doFilter(ServletRequest request, ServletResponse response,
  19.                          FilterChain chain)
  20.     throws IOExceptionServletException {
  21.         // Conditionally select and set the character encoding to be used
  22.         if (ignore || (request.getCharacterEncoding() == null)) {
  23.             String encoding = selectEncoding(request);
  24.             if (encoding != null)
  25.                 request.setCharacterEncoding(encoding);
  26.         }
  27.     // Pass control on to the next filter
  28.         chain.doFilter(request, response);
  29.     }
  30.     public void init(FilterConfig filterConfig) throws ServletException {
  31.     this.filterConfig = filterConfig;
  32.         this.encoding = filterConfig.getInitParameter("encoding");
  33.         String value = filterConfig.getInitParameter("ignore");
  34.         if (value == null)
  35.             this.ignore = true;
  36.         else if (value.equalsIgnoreCase("true"))
  37.             this.ignore = true;
  38.         else if (value.equalsIgnoreCase("yes"))
  39.             this.ignore = true;
  40.         else
  41.             this.ignore = false;
  42.     }
  43.     protected String selectEncoding(ServletRequest request) {
  44.         return (this.encoding);
  45.     }
  46. }


配置web.xml

[pre]    <filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GBK</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>Set Character Encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>[/pre]

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多