Board logo

标题: tomcat乱码问题 [打印本页]

作者: look_w    时间: 2019-4-17 18:39     标题: tomcat乱码问题

 首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系),如果必须写的话,尽量手动带参数-ecoding GBK或-ecoding gb2312编译;对于JSP,在文件头加上<%@ page contentType="text/html;charset=GBK"%>或<%@ page contentType="text/html;charset=gb2312"%>基本上就能解决这类乱码问题。

 本文要重点讨论的是第二类乱码,即Java程序与其他存储媒介交互时产生的乱码。很多存储媒介,如数据库,文件,流等的存储方式都是基于字节流的,Java程序与这些媒介交互时就会发生字符(char)与字节(byte)之间的转换,例如从页面提交表单中提交的数据在Java程序里显示乱码等情况。


现在将常见的乱码问题分为JSP页面显示中文乱码、表单提交乱码两类。

     1)JSP页面中显示中文乱码

     在JSP文件中使用page命令指定响应结果的MIME类型,如<%@ page language="java" contentType="text/html;charset=gb2312" %>

     2)表单提交乱码   

     表单提交时(post和Get方法),使用request.getParameter方法得到乱码,这是因为tomcat处理提交的参数时默认的是iso-8859-1,表单提交get和post处理乱码问题不同,下面分别说明。
    (1)POST处理
    对post提交的表单通过编写一个过滤器的方法来解决,过滤器在用户提交的数据被处理之前被调用,可以在这里改变参数的编码方式,过滤器的代码如下:

    <span style="background-color:rgb(255,255,255)">package example.util;
        
        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 SetCharacterEncodingFilter implements Filter {
        
           protected String encoding = null;
        
           protected FilterConfig filterConfig = null;
        
           protected boolean ignore = true;
        
      
         public void destroy() {
        
          this.encoding = null;
          this.filterConfig = null;
        
         }
        
         public void doFilter(ServletRequest request, ServletResponse response,
          FilterChain chain) throws IOException, ServletException {
        
              if (ignore || (request.getCharacterEncoding() == null)) {
           String encoding = selectEncoding(request);
           if (encoding != null) {
            request.setCharacterEncoding(encoding);
           }
          }
          // Pass control on to the next filter
          chain.doFilter(request, response);
        
         }
        public void init(FilterConfig filterConfig) throws ServletException {
        
          this.filterConfig = filterConfig;
          this.encoding = filterConfig.getInitParameter("encoding");
          String value = filterConfig.getInitParameter("ignore");
          if (value == null) {
           this.ignore = true;
          } else if (value.equalsIgnoreCase("true")) {
           this.ignore = true;
          } else if (value.equalsIgnoreCase("yes")) {
           this.ignore = true;
          } else {
           this.ignore = false;
          }
        
         }
        
         protected String selectEncoding(ServletRequest request) {
        
          return (this.encoding);
        
         }
        
        }
    </span>


文中doFilter的代码即为处理乱码的代码。
      web.xml文件加入过滤器


    <filter>
        <filter-name>Encoding</filter-name>
        <filter-class>
                example.util.SetCharacterEncodingFilter
         </filter-class>
        <init-param>
       <param-name>encoding</param-name>
       <param-value>gbk</param-value>
       <!--gbk或者gb2312或者utf-8-->
      </init-param>
      <init-param>
       <param-name>ignore</param-name>
       <param-value>true</param-value>
      </init-param>
     </filter>





Xml代码


    <filter-mapping>
     <filter-name>Encoding</filter-name>
     <servlet-name>/*</servlet-name>
    </filter-mapping>




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0