JSP中的pagaEncoding和contentType中charset的区别
<%@ page contentType="text/html" pageEncoding="GBK" %>
每一个JSP页面中的首行都是以上的内容,其实这一行代码的contentType中还隐藏了一个charset=“编码类型”;
我们知道,JSP本质上就是一个Servlet(JSP可以完成的功能Servlet全都可以完成,反之不行),而Servlet就是一个JAVA类,所以一个JSP页面编写完成之后执行的时候,Tomcat就会自动将其翻译成*.java,然后再由*.java编译成*.class文件,然后当用户访问JSP页面的时候由Tomcat或其他容器来执行*.class文件。
pageEncoding是JSP文件本身的编码,而contentType中的charset是服务器发送给客户端时的内容编码。
下面来做一个小测验就知道这两者的差别了,首先我们新建一个简单的jsp页面,可以看到里面只是简单的输出了一句话“测试pageEncoding和contentType中的charSet的区别!”,其中包含中文和英文字符,pageEncoding编码方式设为“GBK”:
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head>
<title>登陆验证</title>
</head>
<body>
<%="测试pageEncoding和contentType中的charSet的区别!"%>
</body>
</html>
很显然,启动Tomcat程序运行没有任何问题,可以输出。
这样我们再刷新页面会出现中文乱码
但是这种乱码却可以通过改变浏览器的编码方式来解决,在浏览器空白处右键-->编码,选择Unicode(UTF-8)即可。
那我们现在再来改一下,我们将pageEncoding改为utf-8;即:
<%@ page contentType="text/html" pageEncoding="utf-8"%>
这样很明显,JSP在编码的时候将采用utf-8;默认的charset也是utf-8 ,这个时候刷新,页面中又出现了乱码。
在此基础上,我们改变charset=gbk再来看一下效果,此时浏览器的编码为utf-8:
修改浏览器编码为GBK:
可以看到,当pageEncoding编码为UTF-8时无论如何,用户访问JSP页面的时候,内容都是中文乱码。
为什么会这样,pageEncoding和contentType中的charset区别到底在哪里?
网上搜索了一下,我认为下面的这个解释说的挺好,挺详细的。
事实上,jsp需要经过两次“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8的.java文件至utf-8的.class文件,第三阶段就是由Tomcat传回浏览器的网页, 用的是contentType。ContentType 属性指定响应的 HTTP 内容类型。如果未指定 ContentType,默认为 text/HTML。
第一阶段:将jsp编译成Servlet(.java)文件。用到的指令是pageEncoding,根据pageEncoding=“XXX”的指示,找到编码的规则为“XXX”,服务器在将JSP文件编译成.java文件时会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8编码的JAVA源码(即.java)。
第二阶段:从Servlet文件(.java)到Java字节码文件(.class),从UTF-8到UTF-8。在这一阶段中,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。JAVAC用UTF-8的encoding读取java源码,编译成UTF-8编码的二进制码(即.class),这是JVM对常数字串在二进制码(java
encoding)内表达的规范。这一过程是由JVM的内在规范决定的,不受外界控制。
第三阶段:从服务器到浏览器,这在一过程中用到的指令是contentType。服务器载入和执行由第二阶段生成出来JAVA二进制码,输出的结果,也就是在客户端可见到的结果,在这次输出过程中,由contentType属性中的charset来指定,将UTF8形式的二进制码以charset的编码形式来输出。如果没有人为设定,则默认的是ISO-8859-1的形式。
可以简单认为是,pageEncoding是jsp文件本身的编码;contentType的charset是指服务器发送给客户端时的内容编码。例如:pageEncoding="GBK"。这句话的意思是,告诉JVM 这个jsp本身采用的"GBK"编码,在JSP编译成Servlet传给JVM的时候,就用“GBK”的编码方式将Jsp网页源文件翻译成统一的UTF-8形式的Java字节码(如果不加设定,则JVM默认的用ISO-8859-1这种编码方式)。contentType里的charset=gbk,指的是此网页文件输出到浏览器的输出方式为gbk(如果不加设定,则默认为pageEncoding所设定的编码类型),理解了以上的过程,相信大家都对上述的各种乱码情况都有了更深入的理解,知其然而知其所以然了。
(参考文章:http://www.cnblogs.com/kevin-yuan/archive/2011/12/31/2308479.html)
上一篇: kafka配置及启动等命令总结
下一篇: 求任意多边形面积(模板题)
推荐阅读
-
JSP中的pagaEncoding和contentType中charset的区别
-
mysql - PHP中 PDO 的错误模式,ERRMODE_EXCEPTION 和 ERRMODE_WARNING 区别是什么?
-
php进行支付宝开发中return_url和notify_url的区别分析,支付宝notifyurl_PHP教程
-
Oracle 中Return 和exit的区别
-
python2.x中raw_input()和python3.x中的input()的区别讲解
-
Python中__init__和__new__的区别详解
-
YII2 中的models和activeRecord的区别
-
php 中的session 和cakephp中的session有什么区别,该怎么解决
-
php中time()和mktime()方法的区别
-
简单谈谈php中ob_flush和flush的区别_PHP