JSP中几处编码设置的作用及区别(整理版)

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

 

http://www.showweb.cn/program/JSP/4450.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值