• JSP/Servlet-----charset 、pageEncoding差别


    一、JSP/Servlet中的几个编码的作用
            在JSP/Servlet中有4个地方可设置编码(例如以下)。当中前两个仅仅能用于JSP中,后两个可用于JSPServlet 中。 
            1pageEncoding="UTF-8":设置JSP编译成Servlet时使用的编码。 
                  JSP在server上是要先被编译成Servlet的。pageEncoding="UTF-8"的作用就是告诉JSP编译器在将JSP文件编译成Servlet时使用的编码。通常。在JSP内部定义的字符串(直接在JSP中定义,而不是从浏览器提交的数据)出现乱码时。非常多都是因为该參数设置错误引起的。比如,你的JSP文件是以GBK为编码保存的,而在JSP中却指定pageEncoding="UTF-8",就会引起JSP内部定义的字符串为乱码。

     
                  另外,该參数另一个功能。就是在JSP中不指定contentType參数,也不使用response.setCharacterEncoding方法时。指定对server响应进行又一次编码的编码


            2contentType="text/html;charset=UTF-8":指定对server响应进行又一次编码的编码。 
                  在不使用response.setCharacterEncoding方法时。用该參数指定对server响应进行又一次编码的编码。


            3、request.setCharacterEncoding(“UTF-8”):设置对client请求进行又一次编码的编码。 
                  该方法用来指定对浏览器发送来的数据进行又一次编码(或者称为解码)时,使用的编码。


            4response.setCharacterEncoding("UTF-8"):指定对server响应进行又一次编码的编码。

     
                  server在将数据发送到浏览器前。对数据进行又一次编码时,使用的就是该编码。




    二、浏览器怎样对接收和发送的数据进行编码?


            response.setCharacterEncoding("UTF- 8")的作用是指定对server响应进行又一次编码的编码。同一时候,浏览器也是依据该參数来对其接收到的数据进行又一次编码(或者称为解码)。

    可做个实验。在JSP中设置response.setCharacterEncoding("UTF- 8"),在IE中显示该页面时,在IE的菜单 -- "查看" -- "编码"中可看到是" UnicodeUTF-8"。 
            浏览器在发送数据时,对URL和參数会进行URL编码,对參数中的中文,浏览器也是使response.setCharacterEncoding參数来进行URL编码的
            浏览器在接收server数据和发送数据到server时所使用的编码是同样的。默认情况下均为JSP页面的response.setCharacterEncoding參数(或者contentType pageEncoding參数)。我们称其为浏览器编码。当然。在IE中能够改动浏览器编码(在IE的菜单 -- "查看" -- "编码” 中修 改)。但通常情况下,改动该參数会使原本正确的页面中出现乱码。
         



    三、server怎样对接收和发送数据进行编码
            1对于发送数据。server依照response.setCharacterEncoding — contentType — pageEncoding的优先顺序,对要发送的数据进行编码。 
            2对于接收数据,分三种情况(浏览器直接用URL提交的数据,用表单的GET方式提交的数据、用表单的POST方式提交的数据)。各种WEBserver对这三种方式的处理不同样,以Tomcat5.0为例。

     不管使用哪种方式提交。若參数中包括中文,浏览器都会使用当前浏览器编码对其进行URL编码。 
            对于表单中POST方式提交的数据,仅仅要在接收数据的JSP中正确request.setCharacterEncoding參数,即将对client请求进行又一次编码的编码设置成浏览器编码(默认情况下浏览器编码就是在响应该请求的JSP页面中response.setCharacterEncoding设置的值)。就可得到正确的參数编码。
            对于URL提交的数据和表单中GET方式提交的数据,在接收数据的JSP中设置request.setCharacterEncoding參数是不行的。由于在Tomcat5.0中,默认情况下使用ISO- 8859-1URL提交的数据和表单中GET方式提交的数据进行又一次编码(解码)。而不使用该參数对URL提交的数据和表单中GET方式提交的数据进行又一次编码(解码)。要解决该问题,应在Tomcat的配置文件(server.xml)的Connector标签中设置useBodyEncodingForURI(表示是否用request.setCharacterEncoding 參数对URL提交的数据和表单中GET方式提交的数据进行又一次编码,默觉得false。Tomcat4.0中默觉得 true)或 URIEncoding(指定对全部GET方式请求(包含URL提交的数据和表单中GET方式提交的数据)进行统一的又一次编码(解码)的编码)属性。




    四、怎样防止中文乱码 
            1、对于同一个应用最好统一编码,推荐为UTF-8 
            2、正确设置JSPpageEncoding參数 
            3、在全部的JSP/Servlet中设置contentType="text/html;charset=UTF-8"response.setCharacterEncoding("UTF-8")。从而间接实现对浏览器编码的设置。

     
            4、 对于请求,可用过滤器或在每一个JSP/Servlet中设置request.setCharacterEncoding("UTF-8")

    同一时候,要改动Tomcat的默认配置,推荐设置useBodyEncodingForURI=true”(获取參数值时先得设置request.setCharacterEncoding(“UTF-8”)),也可设置URIEncoding= UTF-8”(有可能影响其它应用,故不推荐)

  • 相关阅读:
    【转】IOS缓存机制详解
    Soul网关插件之Sofa
    Soul网关代理Dubbo插件的使用
    Soul网关默认Divide插件的使用
    高性能网关Soul源码调试环境搭建
    大厂面试系列一些问题的解答
    大厂面试系列一些问题的答案
    大厂面试系列(十三):Java基础
    大厂面试助手(十二):场景和设计
    Action Filters for ASP.NET MVC
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5067846.html
Copyright © 2020-2023  润新知