最近碰到这样的情况:
所有页面统一用UTF-8编码,一个页面简单的POST提交数据,后台用Servlet接收,在处理之前先
request.setCharacterEncoding("UTF-8");
然后获取参数
String username=request.getParameter("username");
...
System.out.println(username);
System.out.println(new String(username.getBytes('ISO8859-1"),"UTF-8"));
在这样的情况下:
IE提交请求:第一次输出乱码,第二次输出正常
在Firefox提交请求:第一次输出正常,第二次乱码。
 
最近才碰到这种情况,我简直崩溃了,真是很奇怪。

解决方案 »

  1.   

    请查看你提交表单用的网页是否使用UTF-8编码,网页的代码可能如下:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
    </head>
    <body>
    </body>在此条件下,Servlet接收请求时如果设置了请求数据为UTF-8编码,如:
    request.setCharacterEncoding("UTF-8"); 则:
    // 下面的代码可以正常显示
    System.out.println(username); 
    // 下面的代码出现乱码
    System.out.println(new String(username.getBytes('ISO8859-1"),"UTF-8")); 
      

  2.   

    楼主加个过滤器试试看。
    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
    {
    // web.xml 中配置的编码
    protected String encoding = null;
    protected FilterConfig filterConfig = null; public void destroy()
    {
    this.encoding = null;
    this.filterConfig = null;
    } public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException
    {
    // 判断配置文件中的编码方式是否为空。
    if (encoding != null)

    // 对请求进行编码设置
    request.setCharacterEncoding(encoding);
    }
    // 将处理权转交给下一个处理器
    chain.doFilter(request, response);
    } public void init(FilterConfig filterConfig) throws ServletException
    {
    this.filterConfig = filterConfig;
    // 读取配置文件中设置的编码
    this.encoding = filterConfig.getInitParameter("encoding");
    }
    }
    web.xml 配置
    <!-- 编码过滤器 -->
    <filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>waytide.filter.EncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
      

  3.   

    写个过滤器吧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里面配置下
    </welcome-file-list>
        <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>
      

  4.   


    你把这句System.out.println(new String(username.getBytes('ISO8859-1"),"UTF-8")); 
    改成System.out.println(new String(username.getBytes('ISO8859-1"),"gb2312"));
    试试
      

  5.   

    为了避免这种东西,你首先在开始动手之前就要指定好所有的编码格式。
    创建工程时,指定工程编码是UTF-8,并且指定JS,JSP,XML的所有编码为UTF-8;
    数据库的编码格式也设置为UTF-8。
    已经服务器的编码也设置为UTF-8。
    一般就不会出现什么问题了。