一、JSP/Servlet中的几个编码的作用
在JSP/Servlet中有4个地方可设置编码(如下),其中前两个只能用于JSP中,后两个可用于JSP和Servlet 中。
1、pageEncoding="UTF-8":设置JSP编译成Servlet时使用的编码。
JSP在服务器上是要先被编译成Servlet的。pageEncoding="UTF-8"的作用就是告诉JSP编译器在将JSP文件编译成Servlet时使用的编码。通常,在JSP内部定义的字符串(直接在JSP中定义,而不是从浏览器提交的数据)出现乱码时,很多都是由于该参数设置错误引起的。例如,你的JSP文件是以GBK为编码保存的,而在JSP中却指定pageEncoding="UTF-8",就会引起JSP内部定义的字符串为乱码。
另外,该参数还有一个功能,就是在JSP中不指定contentType参数,也不使用response.setCharacterEncoding方法时,指定对服务器响应进行重新编码的编码
2、contentType="text/html;charset=UTF-8":指定对服务器响应进行重新编码的编码。
在不使用response.setCharacterEncoding方法时,用该参数指定对服务器响应进行重新编码的编码。
3、request.setCharacterEncoding(“UTF-8”):设置对客户端请求进行重新编码的编码。
该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。
4、response.setCharacterEncoding("UTF-8"):指定对服务器响应进行重新编码的编码。
服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。
二、浏览器如何对接收和发送的数据进行编码?
response.setCharacterEncoding("UTF- 8")的作用是指定对服务器响应进行重新编码的编码。同时,浏览器也是根据该参数来对其接收到的数据进行重新编码(或者称为解码)。可做个实验,在JSP中设置response.setCharacterEncoding("UTF- 8"),在IE中显示该页面时,在IE的菜单 -- "查看" -- "编码"中可看到是" Unicode(UTF-8)"。
浏览器在发送数据时,对URL和参数会进行URL编码,对参数中的中文,浏览器也是使response.setCharacterEncoding参数来进行URL编码的.
浏览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的,默认情况下均为JSP页面的response.setCharacterEncoding参数(或者contentType和 pageEncoding参数),我们称其为浏览器编码。当然,在IE中可以修改浏览器编码(在IE的菜单 -- "查看" -- "编码” 中修 改),但通常情况下,修改该参数会使原本正确的页面中出现乱码。
三、服务器如何对接收和发送的数据进行编码?
1、对于发送数据,服务器按照response.setCharacterEncoding — contentType — pageEncoding的优先顺序,对要发送的数据进行编码。
2、对于接收数据,分三种情况(浏览器直接用URL提交的数据,用表单的GET方式提交的数据、用表单的POST方式提交的数据)。各种WEB服务器对这三种方式的处理不相同,以Tomcat5.0为例。 无论使用哪种方式提交,若参数中包含中文,浏览器都会使用当前浏览器编码对其进行URL编码。
对于表单中POST方式提交的数据,只要在接收数据的JSP中正确request.setCharacterEncoding参数,即将对客户端请求进行重新编码的编码设置成浏览器编码(默认情况下浏览器编码就是在响应该请求的JSP页面中response.setCharacterEncoding设置的值),就可得到正确的参数编码。
对于URL提交的数据和表单中GET方式提交的数据,在接收数据的JSP中设置request.setCharacterEncoding参数是不行的,因为在Tomcat5.0中,默认情况下使用ISO- 8859-1对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码),而不使用该参数对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码)。要解决该问题,应在Tomcat的配置文件(server.xml)的Connector标签中设置useBodyEncodingForURI(表示是否用request.setCharacterEncoding 参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,默认为false;Tomcat4.0中默认为 true)或 URIEncoding(指定对所有GET方式请求(包括URL提交的数据和表单中GET方式提交的数据)进行统一的重新编码(解码)的编码)属性。
四、如何防止中文乱码
1、对于同一个应用最好统一编码,推荐为UTF-8
2、正确设置JSP的pageEncoding参数
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”(有可能影响其他应用,故不推荐)