当你的html页面或jsp页面没有显式声明页面编码的时候,也就是没有下面其中之一的代码
<meta http-equiv="content-type" content="text/html; charset=utf-8"> ①
<%@ page language="java" import="java.util.*" contentType="text/html;charset=utf-8"%> ②
的时候,浏览器解析页面使用的是自身的默认编码。本人对四款浏览器做了测试,得到以下结果:
IE9 GB2312
Chrome( 版本 42.0.2311.152 m ) GBK
FireFox ( 版本 38.0.1 ) GBK
360浏览器 7 UTF-8
而当你有显式声明页面编码类型的时候(也就是页面里有上述代码的其中一句,其中 ② 只能在jsp页面里使用),则 浏览器会根据你声明的编码类型进行解析。
② 的优先级非常高,表现在两个方面:1、当此语句存在时,页面按 ② 声明的编码进行解析,这时候 ① 失效(所以我觉得可以省略不写)2、当eclipse的编辑器设置为其它编码时, ② 的优先级仅次于other设置(据本人分析,在eclipse编码设置里面,优先级依次为other > ② > default( 这个在preferences→General→ContentTypes→Text→JSP里面设置,没有的话则跟随workspace的编码 )> workspace (这个在preferences→WorkSpace里面设置) 。这里面有些效果要重启eclipse才看得出来,可能是机制的问题,有些设置后并没有立即生效。(其实第1点表明 ② 在浏览器优先级很高,第2点表明 ② 在eclipse中优先级很高)
至于 ① ,优先级很低,至少在default之下,所以 ① 并没有什么卵用,我觉得它唯一比较明显的价值就是给浏览器指定页面编码。也就是eclipse跟 ① 并没有契合度。。如果把eclipse也比喻为一种浏览器, ② 同样对eclipse起作用,但是 ① 对eclipse就无能为力。
其实 ① 跟 ② 都只是给浏览器声明了解析要用哪种编码,但是你内容都是eclipse里面编辑的,所以归根到底,乱码也跟eclipse的编码设置有关。。。 只有当eclipse的编码跟你声明的编码一样的时候,浏览器才不会出乱码。(这个道理适用于一切IDE) ③
正如前面所说, ② 的优先级很高,所以它取代了eclipse的默认编码,这也就是为什么通过设置 ② ,我们就不需要设置eclipse编码的原因。( ② 真的是一举两得啊,把浏览器跟eclipse都搞定了)
当把 ② 从页面里删掉的时候,eclipse的编码会自动设置为default里面的编码,不过要保存之后才能体现。如果再把 ② 加回去,eclipse的编码又设置成 ② 中指定的。(不信的话你可以在 ② 的charset那里写成abcd,你会看到eclipse的default的编码变成了abcd,当然abcd是无效的编码)
在eclipse切换编码的时候,页面随即进行了重新编码,并且自动保存。而当切换编码后出现了乱码,其实也是可以挽救的,因为只是表面现象,只要你把浏览器的编码设置成跟eclipse一样,就能正常显示。。其实这里面是三个环节: eclipse编码 , 页面声明编码 和 浏览器编码 (参考 ③ )。。。其中 浏览器编码 默认跟 页面声明编码 一样,你当然可以手动把浏览器切换成其它编码啦。(说了这么多,其实 ③ 才是通用法则,当然实现 ③ 的关键是在页面写上 ② )
这次就差不多总结这些吧。基本上都是本人实验所得,还不够权威,仅供参考。有更好想法欢迎交流。