web应用乱码问题

首先,说说 JSP/Servlet 中的几个编码的作用。

JSP/Servlet 中主要有以下几个地方可以设置编码, pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" request.setCharacterEncoding("UTF-8") response.setCharacterEncoding("UTF-8") ,其中前两个只能用于 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") 或者 response.setCharacterEncoding("GBK") ,浏览器均能正确显示中文(前提是你发送到浏览器的数据编码是正确的,比如正确设置了 pageEncoding 参数等)。读者可以做个实验,在 JSP 中设置 response.setCharacterEncoding("UTF-8") ,在 IE 中显示该页面时,在 IE 的菜单中选择 " 查看 (V)" à " 编码 (D)" 中可以查看到是 " Unicode UTF-8 " ,而在在 JSP 中设置 response.setCharacterEncoding("GBK") ,在 IE 中显示该页面时,在 IE 的菜单中选择 " 查看 (V)" à " 编码 (D)" 中可以查看到是 " 简体中文( GB2312 "

        浏览器在发送数据时,对 URL 和参数会进行 URL 编码,对参数中的中文,浏览器也是使用 response.setCharacterEncoding 参数来进行 URL 编码的。以百度和 GOOGLE 为例,如果你在百度中搜索 " 汉字 " ,百度会将其编码为 "%BA%BA%D7%D6" 。而在 GOOGLE 中搜索 " 汉字 " GOOGLE 会将其编码为 "%E6%B1%89%E5%AD%97" ,这是因为百度的 response.setCharacterEncoding 参数为 GBK ,而 GOOGLE 的的 response.setCharacterEncoding 参数为 UTF-8

        浏览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的,默认情况下均为 JSP 页面的 response.setCharacterEncoding 参数(或者 contentType pageEncoding 参数),我们称其为浏览器编码。当然,在 IE 中可以修改浏览器编码(在 IE 的菜单中选择 " 查看 (V)" à " 编码 (D)" 中修改),但通常情况下,修改该参数会使原本正确的页面中出现乱码。一个有趣的例子是,在 IE 中浏览 GOOGLE 的主页时,将浏览器编码修改为 " 简体中文( GB2312 " ,此时,页面上的中文会变成乱码,不理它,在文本框中输入 " 汉字 " ,提交, GOOGLE 会将其编码为 "%BA%BA%D7%D6" ,可见,浏览器在对中文进行 URL 编码时,使用的就是浏览器编码。

        弄清了浏览器是在接收和发送数据时,是如何对数据进行编码的了,我们再来看看服务器是在接收和发送数据时,是如何对数据进行编码的。

        对于发送数据,服务器按照 response.setCharacterEncoding—contentType—pageEncoding 的优先顺序,对要发送的数据进行编码。

        对于接收数据,要分三种情况。一种是浏览器直接用 URL 提交的数据,另外两种是用表单的 GET POST 方式提交的数据。

        因为各种 WEB 服务器对这三种方式的处理也不相同,所以我们以 Tomcat5.0 为例。

        无论使用那种方式提交,如果参数中包含中文,浏览器都会使用当前浏览器编码对其进行 URL 编码。

        对于表单中 POST 方式提交的数据,只要在接收数据的 JSP 中正确 request.setCharacterEncoding 参数,即将对客户端请求进行重新编码的编码设置成浏览器编码,就可以保证得到的参数编码正确。有写读者可能会问,那如何得到浏览器编码呢?上面我们提过了,在默认请情况下,浏览器编码就是你在响应该请求的 JSP 页面中 response.setCharacterEncoding 设置的值。所以对于 POST 表单提交的数据,在获得数据的 JSP 页面中 request.setCharacterEncoding 要和生成提交该表单的 JSP 页面的 response.setCharacterEncoding 设置成相同的值。

        对于 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 (有可能影响其他应用,所以不推荐)。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值