JSP 中 pageEncoding 和 charset 区别以及中文乱码解决方案
一、JSP 中 pageEndcodeing 和 charset 的作用
<%@ page contentType="text/html;charset=GB2312"%>
pageEncoding 是 JSP 文件本身的编码
contentType 的 charset 是指服务器发送给客户端时的内容编码
pageEncoding 和 contentType 的 charset 预设都是 ISO8859-1,JSP 要经过两次的“编码”,第一阶段会用 pageEncoding,第二阶段会用 UTF-8 至 UTF-8,第三阶段就是由 Tomcat出来的网页,用的是 contentType。
- 第一阶段是 JSP 编译成 .java,它会根据 pageEncoding 设定的编码类型读取 .jsp 文件,由指定的编码方案翻译成统一的 UTF-8 JAVA源码(即.java),如果 pageEncoding设定错了,就会出现中文乱码。
- 第二阶段是 JAVAC 的编译阶段,不论 JSP 编写时候用的是什么编码方案,经过这个阶段的结果全部是 UTF-8 的 JAVA 源码。JAVAC 用 UTF-8 的 JAVA 源码,编译成UTF-8 的二进制码(即 .class )。
- 第三阶段是 Tomcat(或其的 Application Container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时参数ContentType 中的 charset 就发挥了功效。
二、JSP 中 pageEncoding 和 charset 的区别
在 JSP/Servlet 中主要有以下几个地方可以设置编 码,pageEncoding="UTF-8"、contentType="text/html;charset=UTF-8"、request.setCharacterEncoding("UTF-8")和 response.setCharacterEncoding("UTF-8"),其中前两个只能用于JSP中,而后两个可以用于JSP和Servlet 中。
- pageEncoding="UTF-8" 的作用是设置 JSP 编译成 Servlet 时使用的编码。
pageEncoding="UTF-8" 的作用就是告诉 JSP 编译器在将 JSP 文件编译成 Servlet 时使用的编码。通常,在 JSP 内部定义的字符串(直接在 JSP 中定义,而不是从浏览器提交的数据)出现乱码时,很多都是由于该参数设置错误引起的。例如,你的 JSP 文件是以 GBK 为编码保存的,而在 JSP 中却指定 pageEncoding="UTF-8",就会引起 JSP 内部定义的字符串为乱码。
另外,该参数还有一个功能,就是在 JSP 中不指定 contentType 参数,也不使用 response.setCharacterEncoding 方法时,指定对服务器响应进行重新编码的编码。 - contentType="text/html;charset=UTF-8" 的作用是指定对服务器响应进行重新编码的编码。
在不使用 response.setCharacterEncoding() 方法时,用该参数指定对服务器响应进行重新编码的编码。 - request.setCharacterEncoding("UTF-8") 的作用是对客户端请求进行重新编码。
该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。 - response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行重新编码的编码。
服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)。所以在无论你在 JSP中设置response.setCharacterEncoding("UTF-8")或者 response.setCharacterEncoding("GBK"),浏览器均能正确显示中文(前提是你发送到浏览器的数据编码是正确的,比如正 确设置了pageEncoding参数等)。
三、浏览器怎样对接受和发送数据进行编码
- 默认情况下浏览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的,均为 JSP 页面的 response.setCharacterEncoding 参数(或者 contentType 和 pageEncoding 参数),我们称其为浏览器编码。
浏览器在发送数据时,对 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。
当然,在 IE 中可以修改浏览器编码(在IE的菜单中选择"查看(V)"à"编码(D)"中修改),但通常情况下,修改该参数会使原本正确的页面中出现乱码。
一个有趣的例子是,在 IE 中浏览 GOOGLE 的主页时,将浏览器编码修改为"简体中文 (GB2312)",此时,页面上的中文会变成乱码,不理它,在文本框中输入"汉字",提交,GOOGLE 会将其编码为"%BA%BA%D7%D6",可见,浏览器在对中文进行URL编码时,使用的就是浏览器编码。
做个实验,在 JSP 中设置 response.setCharacterEncoding("UTF- 8"),在 IE 中显示该页面时,在 IE 的菜单中选择"查看(V)"à"编码(D)"中可以查看到是" Unicode(UTF-8)",而在 JSP中 设置 response.setCharacterEncoding("GBK") ,在 IE 中显示该页面时,在IE的菜单中选择"查看(V)"à"编码(D)"中可以查看到是"简体中文(GB2312)"。 - 对于发送数据,服务器按照 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 的配置文件的 Connecto r标签中设置 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 参数设置成浏览器编码。
JSP 中 pageEncoding 和 charset 区别以及中文乱码解决方案的更多相关文章
- JSP中pageEncoding和charset区别,中文乱码解决方案(转载)
转载自:JSP中pageEncoding和charset区别,中文乱码解决方案 JSP指令标签中<%@ page contentType="text/html;charset=GB23 ...
- jsp中pageEncoding、charset=UTF -8
jsp中pageEncoding.charset=UTF -8" 在JSP/Servlet 中主要有以下几个地方可以设置编码,pageEncoding="UTF-8". ...
- JSP表单提交中文乱码解决方案
分2种提交方式,解决方案不同: 1.form表单提交方式为get 乱码: 解决方案: 因为get方法是参数在URL中显示,因为tomcat的URL编码默认是:IOS-8859-1所以要么改tomcat ...
- PL/SQL客户端中执行insert语句,插入中文乱码
问题描述:在PL/SQL客户端中执行insert语句,插入中文乱码 解决方案: 1.执行脚本 select userenv('language') from dual; 结果为AMERICAN_ ...
- java 乱码详解_jsp中pageEncoding、charset=UTF -8"、request.setCharacterEncoding("UTF-8")
http://blog.csdn.net/qinysong/article/details/1179480 java 乱码详解__jsp中pageEncoding.charset=UTF -8&quo ...
- (转)JSP HTML JAVASCRIPT 中文乱码 解决方案 大全
JSP HTML JAVASCRIPT 中文乱码 解决方案 大全 JSP的中文字符一直是各位初学者首先要解决的问题,下面进行了总结,也给出了解决办法.C4.1 HTML中文编码转换 在JSP文件中的静 ...
- jsp页面中文乱码解决方案
一.JSP页面中文乱码 在JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一种是在JSP中动态输出的中文乱码. 先看一个JSP程序: <%@ page language=&q ...
- 解决java web中safari浏览器下载后文件中文乱码问题
解决java web中safari浏览器下载后文件中文乱码问题 String fileName = "测试文件.doc"; String userAgent = request.g ...
- Java中文乱码解决方案
Java中文乱码解决方案 1.中文乱码解决方案,确保每个文件的默认编码是UTF-8 加入 URIEncoding="UTF-8" 代码中的设置 1>在se ...
随机推荐
- October 6th 2016 Week 41st Thursday
The outer world you see is a reflection of your inner self. 你拥有什么样的内心,你就会看到什么样的世界. And we eventually ...
- python基础——高阶函数
python基础——高阶函数 高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数a ...
- js获取url方法
//设置或获取对象指定的文件名或路径.alert(window.location.pathname); //设置或获取整个 URL 为字符串.alert(window.location.href); ...
- linux 下查mac
sh-4.1# cat /sys/class/net/eth0/address 4c:cc:6a::9a: sh-4.1# ifconfig -a |grep 'HWaddr'|awk '{print ...
- 超好用的plsql设置
http://blog.itpub.net/24496241/viewspace-740917/
- 19.状态者模式(State Pattern)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- MYSQL中'TYPE=MyISAM'错误的解决方案
create 语句后面的TYPE=MyISAM TYPE=MyISAM 和 ENGINE=MyISAM 都是设置数据库存储引擎的语句 ,(老版本的MySQL使用TYPE而不是ENGINE(例如,TYP ...
- 让ASP.NET MVC不使用jsonp也可以跨域访问
跨域问题仅仅发生在Javascript发起AJAX调用,或者Silverlight发起服务调用时,其根本原因是因为浏览器对于这两种请求,所给予的权限是较低的,通常只允许调用本域中的资源,除非目标服务器 ...
- .net学习之泛型、程序集和反射
一.泛型1.CLR编译时,编译器只为MyList<T>类型产生“泛型版”的IL代码——并不进行泛型的实例化,T在中间只充当占位符.例如:MyList 类型元数据中显示的<T> ...
- JS手机浏览器判断(转)
整理查询一下,js判断手机浏览器的方法 <script type="text/javascript"> /* * 智能机浏览器版本信息:包括微信内置 * */ var ...