现在的位置: 首页 > 综合 > 正文

关于content-type 与charsetencoding

2014年07月17日 ⁄ 综合 ⁄ 共 1584字 ⁄ 字号 评论关闭

最近在项目中碰到一个很搞人的乱码问题,由于一些JSP文件之间的编码不一致导致的,

比如a.jsp 的pageEncoding 和b.jsp的pageEncoding不一样.


下面就我的理解说一下这几个设置的关系:

在jsp页面里面,pageEncoding和contentType这两个值,

pageEncoding 是这个jsp文件的编码,

JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType。

  第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。

  第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。

  JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。

  第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效

这两个编码设置一个就可以了,设置之后两者是保持一致的.当然你也可以单独设置不同的值,设置之后,你可以在IE中先F12打开开发工具,找到网络这一项,再打开这个jsp,你会发现在在响应用头里面有一项Content-Type,这个就是你设置的jsp中contentType值.

关于过滤器这个东西,这时候如果你还在过滤器中设置了response的contentType,charsetencoding,这些都改不了你的服务器的处理方式,都是按照你的jsp中配置的值来的.

在servlet中你也可以设置response的这两个值,而且服务器的编码方式会按照你的配置先后顺序来编码,

比如
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=gbk");

这样你在浏览器中改成GBK来查看,才不会乱码,

如果改成这样,

response.setContentType("text/html;charset=gbk");
response.setCharacterEncoding("utf-8");

则需要使用utf-8来查看了.

如果你这样,

response.setContentType("text/html;charset=gbk");
response.setCharacterEncoding("utf-8");
response.setCharacterEncoding("gbk");

你说这样没有说服力,那我改成这样,

response.setContentType("text/html;charset=iso-8859-1");
response.setCharacterEncoding("utf-8");
response.setCharacterEncoding("gbk");

最终还是需要用gbk来查看.

在这里我们可以大致可以得出结论了,按最后一次的配置来生效.

后面还可以继续实验,比如我out.print(this.getClass()+"中国");之后再设置一次,

看看最终的结果是什么.

可以这么说,过滤器真正起作用的是针对没有设置过这两个参数的


抱歉!评论已关闭.