jsp中经常会出现乱码,我们今天来分析一下乱码出现的原因。
jsp生命周期
*.jsp-------->*.java------->*.class-------->浏览器显示html
1、*.jsp--------->*.java
这一步,tomcat会使用自带的java编译器,根据jsp中的encoding来编译jsp文件,并生成编码为utf8的java文件。生成的java文件一定是utf8的,它与jsp文件编码无关。
注意,这一步,通常由于jsp文件中没有指定pageencoding,导致编译出来的java文件出现乱码,从而导致最终在浏览器的是乱码。
2、*.java------->*.class
这一步是固定,java文件是utf8,生成的class文件编码是平台无关的,这一步肯定不会产生乱码。
3、*class----->浏览器显示html
tomcat加载class文件,根据操作系统的编码(Charset.defaultset())来产生响应,输出到浏览器。浏览器,根据jsp文件中的content-type charset来解析html。这一步,如果content-type charset与jvm的默认编码(Charset.defaultset)不一致,就会出现乱码。
form表单提交
form表单提交时,使用页面中header的content-type来编码,然后浏览器根据response header的 content-type charset来解码。
经常见到的问题:
浏览器查看服务器返回数据,发现是乱码,但是使用utf8解码就正常了,这是由于response header 中的content-type charset没有指定编码,比如 Content-Type:*/*;这种情况下,客户端就无法判断数据是什么编码格式,采用默认解码方式,可能就会出现乱码。之所以说是可能,是因为,如果浏览器默认的解码方式与响应的真实编码相同,那就不会出现乱码。
总结:
1、jsp中,设置pageencoding、content-type charset
2、后台程序,设置request的characterencoding,response的content-type charset
3、设置jvm操作流的默认编码,-Dfile.encoding
4、所有后台程序文件都设置为utf8