1、page命令中的pageEncoding:
设置JSP编译成Servlet时,读取JSP时使用的编码。通常,在JSP内部定义的字符串(直接在JSP中定义,而不是从浏览器提交的数据)出现乱码时,很多都是由于该参数设置错误引起的。只能用于JSP中。
另外,当没有设定page命令contentType和response.setCharacterEncoding方法时,它也指定了对服务器响应进行重新编码的编码格式。
实际上,服务器在发送数据时,编码方式是采用response.setCharacterEncoding—contentType—pageEncoding的优先顺序。
2、page命令中的contentType:
指定对服务器响应进行重新编码时采用的编码格式。只能用于JSP中。
另外,当没有设定response.setCharacterEncoding方法时,它也指定了对服务器响应进行重新编码的编码格式。
3、request.setCharacterEncoding:
指定对客户端请求进行编码的编码格式。即对从浏览器端发送过来的数据进行编码时,所采用的编码格式。可用于JSP和Servlet。
4、response.setCharacterEncoding:
指定对服务器响应进行重新编码时采用的编码格式。即在服务器将数据发往浏览器之前,会先进行编码,此时就是采用它。可用于JSP和Servlet。
另外,浏览器在接受和发送数据时,采用的编码也均是response.setCharacterEncoding中设定的编码格式。也就是称为“浏览器编码”。
---------------------------------------------------------------------------------------------------------------------------------
一、实际的交互过程中,JSP进行了两次“编码”:
在JSP转成Servlet时,先采用pageEncoding中指定的编码来读取,然后由指定的编码方案将其转成统一UTF-8格式的java源码,也就是Servlet;
Servlet实际也就是.java文件,它再被以UTF-8编码转成.class文件,即Java byteCode。
服务器载入这些Java byteCode,然后就采用contentType中设定的编码格式将其转换后再返回给客户端,即浏览器中所见内容。
二、服务器在发送数据时,编码方式是采用response.setCharacterEncoding—contentType—pageEncoding的优先顺序;
而服务器在接受数据时,存在三种情况:浏览器直接用URL提交数据、表单用get或post方式提交数据;
因为各种WEB服务器对这三种方式的处理也不相同,所以我们以Tomcat5.0为例。
无论使用那种方式提交,如果参数中包含中文,浏览器都会使用当前浏览器编码对其进行URL编码。
1、对于表单中POST方式提交的数据,只要在接收数据的JSP中正确request.setCharacterEncoding参数,即将对客户端请求进行重新编码的编码设置成浏览器编码,就可以保证得到的参数编码正确。而在默认请情况下,浏览器编码就是你在响应该请求的JSP页面中response.setCharacterEncoding设置的值。所以,对于POST表单提交的数据,在获得数据的 JSP页面中request.setCharacterEncoding要和生成提交该表单的JSP页面的 response.setCharacterEncoding设置成相同的值。
2、对于URL提交的数据和表单中GET方式提交的数据,在接收数据的JSP中设置request.setCharacterEncoding参数是不行的,因为在Tomcat5.0中,默认情况下使用ISO- 8859-1对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码),而不使用该参数对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码)。要解决该问题,应该在Tomcat的配置文件的Connector标签中设置useBodyEncodingForURI或者URIEncoding属性,其中
useBodyEncodingForURI参数表示是否用request.setCharacterEncoding 参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,在默认情况下,该参数为false(Tomcat4.0中该参数默认为 true);
URIEncoding参数指定对所有GET方式请求(包括URL提交的数据和表单中GET方式提交的数据)进行统一的重新编码(解码)的编码。
URIEncoding和useBodyEncodingForURI区别是,URIEncoding是对所有GET方式的请求的数据进行统一的重新编码(解码),而useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数对数据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。所以对于URL提交的数据和表单中GET方式提交的数据,可以修改 URIEncoding参数为浏览器编码或者修改useBodyEncodingForURI为true,并且在获得数据的JSP页面中 request.setCharacterEncoding参数设置成浏览器编码。
下面总结下,以Tomcat5.0为WEB服务器时,如何防止中文乱码。
1、对于同一个应用,最好统一编码,推荐为UTF-8,当然GBK也可以。
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,也可以将URIEncoding参数设置为 UTF-8(有可能影响其他应用,所以不推荐)。
转载原文:
http://hi.baidu.com/encodinglife/blog/item/5d1655091380c2a72fddd4dc.html