我知道这个问题已经在网上被问过很多次了,可是我按照网上的解决办法还是没有解决问题。我的是Tomcat6.0.20版本,
jdk是前两天刚从网上下的最新的jdk-6u17-windows-i586,我想分别测试用提交表单的方式和超链接的方式访问Servlet,我用来测试的jsp和Servlet代码如下:
servlet.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<body>
<p>通过表单访问Servlet</p>
<form action="servlet">
  姓名<input type="text" name="name"/>
  <input type="submit"/>
</form>
<p>通过链接访问Servlet</p>
<a href="servlet">点此访问Servlet</a>
</body>
</html>
myServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class myServlet extends HttpServlet{
    private int num;
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("Servlet初始化");
        num=0;
    }
    public void service(HttpServletRequest request,HttpServletResponse response) throws IOException{
   System.out.println("Servlet开始工作");
   PrintWriter out=response.getWriter();
       response.setContentType("text/html;charset=UTF-8");
       response.setCharacterEncoding("UTF-8");
       String name = request.getParameter("name");
       out.println("<html><body>");
       if(name == null)
           out.println("Hello游客,This is your first Servlet");       
       else
           out.println("Hello,"+name+",This is your first Servlet");
       out.println("number="+num++);
       out.println("</body></html>");
    } 
    public void destroy(){
        System.out.println("Servlet对象被释放");
    }
}
运行的结果是:在servlet.jsp页面的文本框中输入中文(比如我输入“张三”),这时会在servlet页面显示"Hello,张三,This is your first Servlet ……",而如果点击servlet.jsp页面下面的超链接并且不在文本框中输入任何内容,则会在
servlet页面显示“Hello??,This is your first Servlet……”
我试过这几种方法:
(1)在servlet中先写response.setContentType("text/html;charset=UTF-8");
                  response.setCharacterEncoding("UTF-8");
再写PrintWriter out=response.getWriter();这时结果是:点击超链接,显示“Hello游客,This is your first Servlet ……”,而输入表单显示“Hello,ÁõÅô,This is your first Servlet ……”
(2)使用getBytes("ISO_8859_1"),"GB2312")
(3)加入编码过滤器,代码如下:
import java.io.* ;
import javax.servlet.* ;
public class EncodingFilter implements Filter
{
public void init(FilterConfig filterConfig) throws ServletException {System.out.println("编码过滤器初始化");} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
              throws IOException, ServletException
{
try{
    System.out.println("编码过滤器开始工作");
request.setCharacterEncoding("GB2312") ;
}catch (Exception e) {}

chain.doFilter(request,response) ;
} public void destroy() {System.out.println("编码过滤器销毁");}
}
以上方法都没能解决中文显示的问题,请各位帮忙,感谢!

解决方案 »

  1.   

    把中文处理写在过滤器中试试 编码方式是UTF-8
      

  2.   

    我把编码过滤器中的编码方式该成了UTF-8,运行结果还是不行,通过超链接访问正常,通过表单还是显示
    :“Hello,ÕÅÈý,This is your first Servlet ……”
      

  3.   

    2)使用getBytes("ISO_8859_1"),"UTF-8")试一试 
      

  4.   


            request.setCharacterEncoding("utf_8");       
            String name =  getBytes(request.getParameter("name"),"ISO_8859_1");\
    试试
      

  5.   

    写个过滤器
    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>
      

  6.   

    6楼的办法比较共同继承Filter 然后配置就行
      

  7.   

    jsp是GB2312
    servlet是utf-8
    没有影响吗?
      

  8.   

    现在我把所有的编码格式都设成了GBK,同时部署了过滤器,并且在Servlet里写了如下两句:
    response.setContentType("text/html;charset=GBK");
    response.setCharacterEncoding("GBK");
    现在可以正确显示中文了,我这样理解对吗?
    过滤器是将用户的请求信息以一定的编码方式发送(比如我的是GBK),但是如果在页面中不写
    response.setContentType("text/html;charset=GBK");
    response.setCharacterEncoding("GBK");
    的话也不能保证正确显示中文;如果不加过滤器,那么用户请求信息可能就不是中文编码方式了,就算写了:
    response.setContentType("text/html;charset=GBK");
    response.setCharacterEncoding("GBK");
    也不能正确显示中文,所以过滤器是保证发送的时候编码方式,而
    response.setContentType("text/html;charset=GBK");
    response.setCharacterEncoding("GBK");
    两句保证服务器应答时的编码方式。过滤器和Servlet中的编码设置共同保证了中文的正确显示。
      

  9.   

    用过滤器啊!简单的就是String name=new String(request.getParameter("name").getBytes("ISO-8859-1"));
      

  10.   

    还有一种情况   如果你用的是jdbc高级配置(配置文件的那种)你的工具版本也会导致乱码的出现。
      

  11.   

    1.<p>通过链接访问Servlet</p>
    <a href="servlet">点此访问Servlet</a>
    </body>
    这里的改为:
    <p>通过链接访问Servlet</p>
    <a href="javascript:encodeURI('servlet')">点此访问Servlet</a>
    </body>
      

  12.   

    String name = new String(request.getParameter("name").getbytes("iso-8859-1"),"utf-8");
      

  13.   

    tomcat 参数编码都是iso-8859-1
      

  14.   

    搞那么麻烦,全部统一用UTF-8,就不会这么麻烦了。
    看你jsp Gb2312,里面又utf-8,tomcat里面还不知道是什么
      

  15.   

    自己练习时养成个统一编码的习惯,要么全UTF-8,要么全GBK,这样少去很多编码转换的麻烦
      

  16.   

    都设置成统一编码吧。好像中文很多都是gbk编码
      

  17.   

    需要注意的是,在你原始方案中servlet.jsp使用的是GB2312,myServlet.java中看你的本意是使用UTF-8。如果是这样的话,你的原始方案中有两处代码有问题:第一点:myServlet.java中取得的属性name需要进行原始码为GB2312的ISO-8859-1解码,即:String name = request.getParameter("name");
    if (name != null && !"".equals(name)) {
        name = new String(name.getBytes("ISO-8859-1"), "GB2312");            
    }第二点:你的myServlet.java中部分代码的顺序不对,如:PrintWriter out=response.getWriter();
    response.setContentType("text/html;charset=UTF-8");
    response.setCharacterEncoding("UTF-8");这样的代码,UTF-8没有影响到输出结果,输出结果使用的仍然是GB2312编码。正确的写法应该是:response.setContentType("text/html;charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
    PrintWriter out=response.getWriter();
    如此,在你的原始方案基础上,只要将myServlet.java修正一下即可解决问题。
    package test.servlet;
    import java.io.*;import javax.servlet.*;
    import javax.servlet.http.*;
    public class HelloServlet extends HttpServlet{
        private int num;
        public void init(ServletConfig config) throws ServletException {
            super.init(config);
            System.out.println("Servlet初始化");
            num=0;
        }
        
        @Override
        public void service(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            System.out.println("Servlet开始工作");        // 改变1
            response.setContentType("text/html;charset=UTF-8");
            response.setCharacterEncoding("UTF-8");
            PrintWriter out=response.getWriter();        // 改变2
            String name = request.getParameter("name");
            if (name != null && !"".equals(name)) {
                name = new String(name.getBytes("ISO-8859-1"), "GB2312");            
            }
            
            out.println("<html><body>");
            if(name == null)
                out.println("Hello游客,This is your first Servlet");       
            else
                out.println("Hello,"+name+",This is your first Servlet");
            out.println("number="+num++);
            out.println("</body></html>");
        }    public void destroy(){
            System.out.println("Servlet对象被释放");
        }
    }
    关于Java WEB应用中乱码问题的详细描述,可以参考我的博客《如何解决Java WEB应用中的乱码问题》
      

  18.   

    理解正确。不全面。当用户端发出一个HTTP请求时,一个如下格式的数据将发送给服务器端:<request-line>
    <headers>
    <CRLF>
    [<request-body><CRLF>]关于HTTP请求的格式,可以在HTTP协议与HTML表单(再谈GET与POST的区别)中了解更多的内容。过滤器只对request-body进行解码处理,对于request-line部分,以Tomcat为例,必须在server.xml中的Connector标签中指定URIEncoding标签属性。例如:<Connector connectionTimeout="40000" port="8080" protocol="HTTP/1.1" 
            URIEncoding="GB2312" redirectPort="8443"/>如果表单使用POST方式的提交,则可以用过滤对请求数据进行解码,如使用GET方式提交表单数据的话,则只能用上述方法对数据进行解码了。解码之后的数据可以在servlet中直接读取,不必再进行ISO-8859-1解码处理了。
      

  19.   

    Servlet解决服务器端传给客户端产生的乱码问题
    添加GB2312编码
    向服务器输出中文时出现乱码或“?”最常用的解决方案:
    service(HttpServletRequest request,HttpServletResponse response){
    String s =” 中文”;
    response.setContentType(“text/html;charset=utf-8”);
    PrintWriter out = response.getWriter();
    out.println(s);
    }
    以上方法有时候会失灵,所以使用下面试试:
    service(){
    String s = “中文”;
    PrintWriter out = response.getWriter();
    response.setHeader(“Content-Type”,”text/html;charset=utf-8”);//设置Conten-Type响应头
    out.println(new String(s.getByte(“utf-8”),”iso-8859-1”));
    }//获得utf-8编码的字节数组后,将其按原样保存在String对象中
    }
    解决服务器端程序读取中文消息乱码问题:
     客户端传来的数据要进过HTTP协议解析,解析的时候使用URLEncoding方式编码,所以在服务器端需要解码,方式:
    String s =”%E9%A3%9E%E7%BF%94”://包含URL编码的字符串
    Sys…(java.net.URLDecoder.decode(s,”utf-8”));//使用utf-8字符集编码对该字符串解码,
    但是tomcat在内部自动完成了这一步,就是当开发人员通过getParameter方法获得name参数值是,tomcat已经使用decode方法对请求的参数惊醒转换了。因此这里就会产生一个问题,Tomcat并不知道要使用utf-8编码格式进行转换,而decode方法的第二个参数需要一个知道的编码格式。那么tomcat又是根据什么编码格式进行编码转换的呢?实际上,在默认情况下,tomcat是使用iso-8859-1编码格式进行转换的,如果按照iso-8859-1进行编码,就相当于直接将字节存放到String变量中,不做任何转换。如下面代码所示:String s=” %E9%A3%9E%E7%BF%94”;
    String s = URLDecoder.decode(s,”iso-8859-1”);
    Sy…(s);
    上面的代码中的s变量所对应的字节仍然是“E1 A3…”,由于java内部使用的是UCS2编码,但现在s变量里保存的是UTF-8,更糟糕的是,java把这些编码当成了ucs2编码来解析了,也就是说,对于java来说,这个6个字节的utf-8编码就成了3个UCS2编码格式的字符,因此,就会持续乱码。既然知道了原理,那就非常容易解决了。只需要将这些UTF-8编码再转换成UCS2编码保存在s变量中即可,如下:
    String s1=" %E9%A3%9E%E7%BF%94";
    try {
    String s2 = URLDecoder.decode(s1,"iso8859-1");
    System.out.println(new String(s2.getBytes("iso8859-1"),"utf-8")+"=====================");
    } catch (UnsupportedEncodingException e) {
    // XXX Auto-generated catch block
    e.printStackTrace();
    }在tomcat下设置编码:
    在默认情况下,tomcat是使用iso8859-1进行编码的,但是如果修改了这个默认值,就可以直接输出中文了。有了这种解决方案,就不能使用以上解决方案了。
    在<Connector port=”8080 protocol=”HTTP/1.1“20000   8443。
    URIEncoding=”UTF-8”/>//这样设置之后不需要在java文件中设置编码了
    注意:想第二种情况下,不能使用第一种情况下的解决方案,否则会输出”?”
      

  20.   

    把tomcat,JSP,servlet编码格式一致即可
      

  21.   

           response.setContentType("text/html;charset=UTF-8");
           response.setCharacterEncoding("UTF-8");
      

  22.   

    可以这样设置
    第一是在页面,设置为utf-8
    第二是在数据库,也是utf-8
    第三写个编译器
    在每次发送请求的时候都捕获过滤
      

  23.   

    如果使用过滤器时。里面还有中文乱码为题的话,还有一个地方要设置。tomcat里面的servlet.xml文件的第50行加一个属性:URIEncoding="gbk" 这样就哦了
      

  24.   

    从页面传送的时候先decode,后台获取的时候解码,以前在移动12580系统里处理过类似的中文乱码问题,具体代码就没记住。
      

  25.   

    response.setContentType("text/xml;charset=utf-8");
    request.setCharacterEncoding("utf-8");
      

  26.   

    http://blog.csdn.net/swit1983/archive/2009/08/09/4427120.aspx  
    我这篇文章很全,也很闹人。
      

  27.   

    public void service(HttpServletRequest request,HttpServletResponse response) throws IOException{
           System.out.println("Servletchinese wholesalers
    ugg");
           PrintWriter out=response.getWriter();
           response.setContentType("text/html;charset=UTF-8");
           response.setCharacterEncoding("UTF-8");
           String name = request.getParameter("name");
           out.println("<html><body>");
      

  28.   

    Java code
    这个地方出错了,他往前台传值的时候编码乱,捋顺你的思路在看看
      

  29.   

    用  method=post  试下
      

  30.   

    同意21楼的,其实就是你jsp页面设置的编码字符集和servlet的字符集不同引起的,还有一点。我没仔细看你的代码,数据库的编码也有关系