JSP/Servlet编码导致乱码问题总结


jsp页面的三处编码:

 

    1.<%@ page language="java" pageEncoding="UTF-8"%>


        作用:告诉jsp编译器将jsp编译成Servlet时使用的字符编码

        例如,你的JSP文件是以GBK为编码保存的 (右击jsp-->Properties --> Text file encoding

               设置成与pageEncoding不一致时,就有乱码),而在JSP中却指定pageEncoding="UTF-8",

                就会引起JSP内部定义的字符串为乱码。


    2.<%@page contentType="text/html; charset=UTF-8" %>


        作用:告诉浏览器对发送给服务器的数据编码和对响应数据解码所使用的字符编码

    

    3.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


        作用:控制浏览器以何种字符编码显示网页内容


Servlet中的两处编码


     1.request.setCharacterEncoding("UTF-8")


        作用:设置对客户端请求的参数进行解码所使用的字符编码

                * 只对两种请求参数提交方式有效:

                * POST表单提交

                * GET提交(url或GET表单提交), 此时要求配置

                server.xml的<Connector>标签的属性:useBodyEncodingForURI="true"

                

     2.response.setCharacterEncoding("UTF-8");


        作用:设置服务器对响应数据进行编码所使用的字符编码



浏览器编解码说明


           浏览器在接收或发送数据时,会对URL和参数会进行URL解码(接收)或编码(发送),所使用的编码为:           

            <%@pagecontentType="text/html;charset=GBK" %>

                               或response.setCharacterEncoding("UTF-8")指定的编码



服务器编解码说明

          服务器发送数据时,按照response.setCharacterEncoding—contentType—pageEncoding

          的优先顺序,对要发送的数据进行编码。

          服务器接收数据,要分三种情况。

                一种是浏览器直接用URL提交的数据,另外两种是用表单的GET和POST方式提交的数据


(1)表单中POST方式提交的情况:


              可以通过request.setCharacterEncoding(charset),来设置对浏览器提交的数据使用什么样的

          编码进行解码。如果不设置时,服务器默认使用ISO-8859-1来解码请求参数。如果页面的

          contentType="GBK", 此时要想得到正确的结果,则:

          Stringname = newString(request.getParameter("name").getBytes("ISO-8859-1"),"GBK");

           如果设置:request.setCharacterEncoding("GBK"),则只需:String name = request 

         .getParameter("name");所以对于POST表单提交的数据,在获得数据的JSP页面中       

          request.setCharacterEncoding要和生成提交该表单的JSP页面的

           response.setCharacterEncoding设置成相同的值。

          还有一种方法解决POST提交乱码问题:使用过滤器,在过滤器中设置

           request.setCharacterEncoding(charset)


(2)URL提交的数据和表单中GET方式提交的情况:


                   此时设置request.setCharacterEncoding参数是不行的,因为在Tomcat5.0中,

            默认情况下使用ISO-8859-1对URL提交的数据和表单中GET方式提交的数据进行解码,

           而不使用该参数对URL提交的数据和表单中GET方式提交的数据解码。要解决该问题,

          应该在Tomcat的配置文件server.xml的Connector标签中设置useBodyEncodingForURI

         或者URIEncoding属性,

         *useBodyEncodingForURI参数为true时表示用request.setCharacterEncoding参数对URL

          提交的数据和表单中GET方式提交的数据进行重新解码。

         *URIEncoding参数指定对所有GET方式请求(包括URL提交的数据和表单中GET方式提交的数据)

          进行统一解码的编码

    

       即处理get方式请求参数有四种情况:

                * 不设置server.xml的Connector标签,此时服务器统一对get方式的请求参数进行ISO-8859-1

                   解码,此时设置request.setCharacterEncoding(charset)是无效的

               * 设置server.xml的Connector标签,令useBodyEncodingForURI="true",此时使用情况和

                  post提交方式一致

               * 设置server.xml的Connector标签,令URIEncoding="charset",此时服务器统一对get方式的

                  请求参数进行charset解码

              * 设置server.xml的Connector标签,令useBodyEncodingForURI="true"URIEncoding="charset", 

                 此时URIEncoding设置无效

 

                <Connectorport="8080" maxThreads="150" minSpareThreads="25"maxSpareThreads="75" 

                    enableLookups="false"

                    redirectPort="8443"

                    acceptCount="100" 

                   debug="0"

                   connectionTimeout="20000" 

                  disableUploadTimeout="true"

                  useBodyEncodingForURI="true"URIEncoding="UTF-8"/>