全局的过滤器:
<filter>
 <filter-name>EncodingFilter</filter-name>
<filter-class>com.mmis.publicClass.EncodingFilter</filter-class>
        <init-param>
           <param-name>encoding</param-name>
           <param-value>GB18030</param-value>
        </init-param>
 </filter>
     <filter-mapping>
         <filter-name>EncodingFilter</filter-name>
         <url-pattern>/*</url-pattern>
     </filter-mapping>
JSP默认设置了为GB18030:
<% page language=”java” import=”java.util.*” pageEncoding=”GB18030>
数据库创建的编码为GBK:my.ini中为:default-character-set=gbk
Action中的为:<constant name="struts.locale" value="zh_CN"></constant>
<constant name="struts.i18n.encoding" value="GB18030"></constant>
Tomcat 中server.xml文件中URLEncoding为:GBK
我尝试在控制台中往数据库输入中文,没错,在JSP中取得时候显示的也没错,就是在JSP表单中输入中文然后保存的时候,进入数据库就变成乱码了。上面能牵扯到编码的地方都列出来了。

解决方案 »

  1.   


    是过滤器的没有生效的原因吗?刚开始用的是spring自带的那个,没用,后来自己写了个,是不是根本就没有过滤到action的请求
      

  2.   


    <?xml version="1.0" encoding="utf-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter> <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern> </filter-mapping> <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!--  
    <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>GB18030</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    -->
     <filter> 
         <filter-name>EncodingFilter</filter-name>
         <filter-class>com.mmis.publicClass.EncodingFilter</filter-class> 
         <init-param> 
           <param-name>encoding</param-name> 
            <param-value>GB18030</param-value> 
          </init-param>
          </filter>
          
           <filter-mapping>
                <filter-name>EncodingFilter</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping>

    </web-app>
      

  3.   


    <?xml version="1.0" encoding="utf-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter> <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern> </filter-mapping> <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!--  
    <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>GB18030</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    -->
     <filter> 
         <filter-name>EncodingFilter</filter-name>
         <filter-class>com.mmis.publicClass.EncodingFilter</filter-class> 
         <init-param> 
           <param-name>encoding</param-name> 
            <param-value>GB18030</param-value> 
          </init-param>
          </filter>
          
           <filter-mapping>
                <filter-name>EncodingFilter</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping>

    </web-app>

    把编码过滤器 放到最上面
      

  4.   

    以下是个人关于乱码的一个总结,可以从下面的4个方面检查一下:struts2 Filter:
    package com.zndt.znfw.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;
    import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;
    /* 继承struts的核心过滤器 */
    public class CharacterEncodingFilter extends StrutsPrepareAndExecuteFilter{
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
    FilterChain arg2) throws IOException, ServletException {
    arg0.setCharacterEncoding("UTF-8");/* 1 */
    arg1.setCharacterEncoding("UTF-8");/* 2 */
    super.doFilter(arg0, arg1,arg2);
    }
    }web.xml
    <filter>
    <filter-name>struts2</filter-name>     <filter-class>com.zndt.znfw.util.CharacterEncodingFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
    </filter-mapping>
    tomcat 
    URI问题:
    <Connector port="8080" 
    maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
    enableLookups="false" redirectPort="8443" acceptCount="100" 
    debug="0" connectionTimeout="20000" useBodyEncodingForURI="true" 
    disableUploadTimeout="true" URIEncoding=”UTF-8”/>取:
    里面所设置的URIEncoding=”UTF-8”再进行一次编码,但是由于已经编码为utf-8,再编码也不会有变化了。(指的是后台代码request.setCharcterEncoding(“utf-8”))
    拿:
    如果是从url获取编码,接受页面则是根据URIEncoding=”UTF-8”来进行解码的。(指的是浏览器拿到页面之后按照utf-8来解码)jsp:
    <%@ page language="java" pageEncoding="UTF-8"%>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">数据库端的编码方式:
    也设置为UTF-8
    example:
    mysq url 驱动:
    jdbc:mysql://localhost/WEBCLDB?useUnicode=true&characterEncoding= UTF-8。
      

  5.   

    在项目中。在html的属性总设置编码格式。
      

  6.   

    1: 页面应该有两处需要修改编码;
    2: web.xml文件的过虑器是否正确, 并且要放在文件内容的前面;
    3: 在action接收是在转下编码, iso-8859-1;注: 各处编码要统一;因为数据在java中就出错了, 所以数据库暂时不需要检查。 只要存之前没有乱码的话, 再者数据库的编码是统一的话就不会出错了。
      

  7.   

    我也是无语了。不明白为什么要用那么多种编码。一个项目统一一种编码,这是最好避免乱码的方法。还有,你要过滤action的编码,那你的filter要放在struts的过滤器上面,要不你自己的过滤器执行不了。建议还是把编码统一试试,过滤器位置换换。
      

  8.   

    数据库安装的时候没选utf-8,就选了GBK,MyEclipse中JSP选编码的时候为了能通数据库同步就选了GB18030(与GBK是兼容的)MyEclipse好像没有GBK