我们公司网站以前开发时候有一个过滤器,负责处理请求编码。
全部都处理成GB2312了。可我后面加了一些功能,有一个表单提交后,我在action里面用form取中文的时候就成乱码了。
原因是过滤器把request的编码设置成GB2312了,我把过滤器改成utf-8就好了。
但现在是如何不改变过滤器就能解决乱码问题?

解决方案 »

  1.   

    在每次提交的时候将这些打散再重新组合
    就像这样sp初步页面传递中的中文乱码处理非常简单的传递过程
        <form action="test.jsp">
            username : <input type="text" name="username" />
            <br />
            <input type="submit">
        </form>
        也就是输入框传值.
        test.jsp中主要代码为:
            Hello <%=request.getParameter("username")%>
        这样不可能出现乱码的因为这里面没出现中文。
        如果改成这样:
        <form action="test.jsp">
            用户名 : <input type="text" name="username" />
            <br />
            <input type="submit">
        </form>
        这样就会在这个页面出错用户名那里就会出现乱码。
        这里分析下出现乱码的原因:
        主要有请求和响应中可能出现的乱码。
        所谓响应中的乱码,就是显示页面上的乱码,因为页面数据是从服务器一端放入响应(response)中,然后发
        送给浏览器,如果响应中的数据无法被正常解析,就会出现乱码问题。
        为什么英文就没有问题呢?因为在iso-8859-1,gb2312, utf-8以及任意一种编码格式下,英文编码格式都
        是一样的,每个字符占8位,而中文就麻烦了,在gb2312下一个中文占16位,两字节,而在utf- 8下一个中
        文要占24位,三字节。浏览器在不知道确定编码方式的情况下,就会把这些字符从中间截断,再显示的时
        候就乱掉了。所以,想要解决乱码问题,就是要告诉浏览器我们到底使用了什么样的编码方式。
        解决方法:
        #因为服务器要先从本地读取jsp文件,然后经过处理后写入响应,所以我们首先要知道的就是jsp文件的编
        码格式。从问题的源头着手解决。在咱们用的windowxp下,文件默认的编码格式是gb2312。
        #我们要在http的响应(response)中添加编码信息,使用如下方式:
        <%@ page contentType="text/html; charset=gb2312"%>
        #我们还需要在html中指定编码格式。
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
        <title>title</title>
        </head>
        meta部分用来指定当前html的编码格式,注意这一段要放在head标签中,并且放到head标签的最前面,如果
        不是最前面ie下可能会出现问题,尤其是在title中有中文的情况下。
        **在完成了以上三个#好面的检验设置后,基本上能保证得到正确的中文显示了。
        下面传到另外的页面也会产生乱码:我们的表单也就是form传递会有两种方式POST和GET,默认方式GET
        在POST方式下面只要在接受的jsp页面上设置请求的字符编码就可以了如下:
        <%
            request.setCharacterEncoding("gb2312");
        %>
        但是在 GET方式下面就不管用了上面的方法,这样我们只有对每个中文进行转换了,使用new String
        (bytes, "gb2312")进行转码。如下方式:
        <%
            String username = request.getParameter("username");
                byte[] bytes = username.getBytes("iso-8859-1");
            String result = new String(bytes, "gb2312");
            out.print(result);
        %>
            这样处理过程就是,先从request中获得参数,接着把字符串按照iso-8859-1编码打散成byte数组,然后
        用gb2312编码组合成新字符串,最后打印出来就是正常的中文了。    **也可以写成一串如下:
        <%=new String(new String(request.getParameter("username").getBytes("iso-8859-1"), "gb2312")%>
        所以我们尽量设置传递的方式为POST这样就可以很简单的解决中文乱码问题。
      

  2.   

    输出的时候再转换成utf-8不可以么?
      

  3.   

    我用ext的表单提交,他的表单提交编码是utf-8。
    经过过滤器一转request的编码就成gb2312了。
    这样接到的东西肯定是乱码,但如何不修改过滤器就解决乱码问题