解决乱码总的思想就是编码一致
我的解决方案是:在网上弄了一个Filter
连接数据库是时 设置characteEncoding=gbk
然后在执行sql语句时,通常也要转换一下
sql = new String(sql.getBytes("gbk"),"ISO-8859-1");
在页面显示时,也要对要显示的数据转换一下  str = new String(sql.getBytes("ISO-8859-1"),"gbk");在这里,我想问一下,那个Filter的作用不就是用来处理中文乱码的吗?为什么还需要后面的步骤啊?
页面的编码是gbk的,连接数据库时要characteEncoding=gbk,这个还能理解,为什么在执行sql语句和读取数据的时候又要转换啊?而且还是在gbk和ISO-8859-1之间转换,不大明白,

解决方案 »

  1.   

    在URL中传递参数,它是通过HTTP表头来传递的.并不是通过表单来传递。
    表单中传递的参数是在HTTP中的BODY中传送的.而设置字符过滤器只能起到过滤HTTP中BODY中的参数.而TOMCAT默认是ISO8859-1的编码方式,所以你在URL中传递过去后就是乱码了.而且过滤器也不管用了.
    所以为了防止字符集不同产生的乱码问题,中文在作为参数传递的时候会因为字符集编码出现絮乱,数据在网络中是以ISO-8859-1码来传的。
    为了防止程序在使用的过程中发生这种情况,所以要进行转码处理一下ISO-8859-1,国际统一认证转换方式
      

  2.   

    我也认为加了过滤器就不用其他的了,问题是只用过滤器后,向数据库插入数据,中文就是乱码
    sql = new String(sql.getBytes("gbk"),"ISO-8859-1"); 
    这个设置了之后就不是乱码了,但从数据库读取出来的时候还是乱码,所以又用了这个:str = new String(sql.getBytes("ISO-8859-1"),"gbk"); 
    不知道是不是过滤器配置问题
      

  3.   

    你没把页面的编码改成gbk吧给每个页面加上<%@ page contentType="text/html; charset=gbk" language="java"%>这个试试
    还有你可以使用spring自带的filter进行转码,只需在web.xml里加入这段代码:
    <filter>
       <filter-name>Encoding</filter-name>
       <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
       <init-param>
       <param-name>encoding</param-name>
       <param-value>GBK</param-value>
       </init-param>
       <init-param>
       <param-name>forceEncoding</param-name>
       <param-value>true</param-value>
       </init-param>
      </filter>
      <filter-mapping>
       <filter-name>Encoding</filter-name>
       <url-pattern>/*</url-pattern>
      </filter-mapping>
    或者自己写一个也行,代码大概如下:
    package filter;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 javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;/*中文乱码处理filter*/
    public class SetCharacterEncodingFilter implements Filter { private String encoding = "gbk"; public void destroy() {
    } public void doFilter(ServletRequest req, ServletResponse resp,
    FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;
    request.setCharacterEncoding(encoding);
    filterChain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException {
    this.encoding = filterConfig.getInitParameter("encoding");
    }}
    在web.xml里加入下面这段代码:
       <filter>
        <filter-name>Encoding</filter-name>
        <filter-class>filter.SetCharacterEncodingFilter</filter-class>
        <init-param>
        <param-name>encoding</param-name>
        <param-value>gbk</param-value>
        </init-param>
       </filter>
       <filter-mapping>
        <filter-name>Encoding</filter-name>
        <url-pattern>/*</url-pattern>
       </filter-mapping>
      

  4.   

    POST提交用过滤器基本没问题了。GET提交还是得在页面编码后再提交到服务器。tomcat配置useBodyEncodingForURI="true" 也可以解决GET提交问题,但是我发现用搜狗输入法打出的中文还是有少数字会乱码,智能ABC没问题
      

  5.   

    加了过滤器后post的数据可以不用处理,get不行的,需要在tomcat的web.xml设置编码,tomcat默认是iso-8859-1不支持中文
      

  6.   

    我的每个页面都设置了<%@ page contentType="text/html; charset=gbk" language="java"%>
    我看视频教程上的过滤器也是你那么写的,我用的是另一个过滤器,生成sql语句往数据库插得时候总是提示空指针异常,然后我转了一下编码就没事了,不知道怎么回事···回头用用你这过滤器····
      

  7.   

    要么是过滤器没起作用,要么就是用get方式提交了
      

  8.   

    页面设置
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>过滤器
    package org.filter;
    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 FilterChar implements Filter{ public void destroy() {
    // TODO Auto-generated method stub

    }
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
    FilterChain arg2) throws IOException, ServletException {
    // TODO Auto-generated method stub
    arg0.setCharacterEncoding("UTF-8");
    arg2.doFilter(arg0, arg1);
    }
    public void init(FilterConfig arg0) throws ServletException {
    // TODO Auto-generated method stub

    }

    }web.xml
     <filter>
       <filter-name>char</filter-name>
       <filter-class>org.filter.FilterChar</filter-class>
      </filter>
      <filter-mapping>
       <filter-name>char</filter-name>
       <url-pattern>/*</url-pattern>
      </filter-mapping>
      

  9.   

    filter主要解决页面与服务器端的乱码问题,而对sql进行的字符转换主要用于与数据库进行交互时保证不出现为乱码而且进行的字符集转换,楼主的数据库应该是ISO-8859-1字符集吧