分享
 
 
 

JSP页面编码问题研究(原创)

王朝java/jsp·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

JSP页面编码问题研究

Motivition曾经有一个网友问过我这样一个问题:

<%@page contentType="text/html; charset=UTF-8"%>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head>

<body>

中国

</body>

</html>

这个页面在为什么在运行的时候“中国”会变成乱码?

Analysis Key Step

对于上面问题的分析需要从整个JSP页面请求的生命周期来看,一般的都需要经历下面几个阶段:

1。应用服务器根据JSP页面生成一个Java文件

2。应用服务器调用java.exe将Java文件编译成一个Servlet对应的class文件

3。用户的浏览器请求JSP对应的Servlet,Web容器起一个线程执行Servlet,将数据返回给客户端浏览器

4。用户的IE根据返回的数据,将结果显示给用户。

Key Step Analysis为了更好的了解编码问题,我们暂时先从上面的四个环节一步步来分析,根据分析的结果,来得到最终的解决办法。

1. 在应用服务器根据JSP页面生成Java文件阶段。

应用服务器会将整个JSP页面的代码读取出来,然后写到一个新的JAVA文件中,在读文件和写文件的时候都牵涉到一个编码问题,这个编码问题应用服务器是如何解决的呢?我研究Tomcat应用服务器的源代码,发现Tomcat中有一个pageEncoding参数非常重要,在ParserController会从JSP文件中读出这个参数(如果没有读到,就从第一行的contentType中读取charset),然后保存起来,如果没有读取到这个参数,会从JspConfig中读出一个默认的PageEncoding参数,如果这两个参数都没有的设置,系统会默认成ISO8859-1的编码来读取原来的JSP文件。

从上面的分析出,我们已经基本了解了应用服务器读取JSP文件的编码方式,由于Java底层都是基于Unicode编码来存储字符的,所以在写文件的时候,都输出成Unicode编码的形式。

2。在JDK将Java文件编译成Class文件的时候

可以利用-encoding参数指定源文件的编码,这在手动编译的时候非常重要,因为这决定了Java虚拟机读取Java文件时采用的编码方式,但是在Web应用中这个环节我们可以忽略,因为应用服务器可以很好的解决这个编码。以Tomcat为例,由于生成的java文件是固定的UTF-8编码,所以Tomcat也固定的采用UTF-8编码来读取,通过浏览AbstractCatalinaTask可以看到reader = new InputStreamReader(hconn.getInputStream(), CHARSET);其中的CHARSET=utf-8。所以在这个环节中应用服务器都可以很好的把握,不会带来编码问题。

3. 用户的浏览器请求JSP对应的Servlet阶段。

如果前面的环节中不会带来编码问题,也就是说在Java虚拟机中运行的时候,能正常的获取到“中国”,那么在执行servlet的环节中不会“中国”始终是以Unicode存储的中国,那么在第三个环节中需要关注的是JspWriter如何将数据返回给客户端浏览器。大家可以试验一下,在java中如果用new String(str.getBytes("encoding"),"encoding")执行的时候,始终不会出现乱码问题,也就是说,一个字符串可以用不同的代码来getBytes()生成字节数组(底层I18N.jar所作的工作,提供Byte2Char和Char2Byte的转换)。

如果大家可以理解这一点,那么下面大家就需要了解JspWriter输出字符串时采用的编码方式是什么?通过浏览Response.java类可以了解到Tomcat应用服务器是根据contentType来获取的writer的编码方式,也就是说,最后返回客户端的字节流是contentType对应的charset中获取出来的字节数组。

4. IE根据返回的数据处理显示阶段

通过前面的分析可以了解到,应用服务器返回的“中国”是根据ContentType中的charset来显示的,只要IE知道该用这个编码来接收字节流并转成字符串,并将用户的浏览器推荐合适的编码来查看结果,用户就可以浏览到正确的“中国”两个字。可以高兴得是,目前的IE等浏览器正式这样处理的。

Conclusion

通过上面的分析,我们可以看到,在整个JSP页面的编码过程中,我们真正要解决的是JSP文件到Java文件这个过程中的编码问题,也就是PageEncoding参数的设置问题。由于pageEncoding参数是servlet2.3规范中规定的参数,所以下面的方法在很多应用服务器下面都通用,这方面的设置本人在工作中基本上得到了下面的一些方法:

1。在JSP页面的中加上pageEncoding参数,比如:<%@ page contentType="text/html; charset=UTF-8" pageEncoding="GBK"%>,这样就可以将页面可以用ANSI来存储。也就是说当页面存储的编码方式和chtentType中的charset不一样的时候,可以考虑加上pageEncoding参数。

2。有些应用服务器(如weblogic),在没有获取到pageEncoding参数的时候,不是先从charset中获取编码类型,而是从另外的一些配置文件,如weblogic.xml文件中加上下面的代码:

<jsp-descriptor>

<jsp-param>

<param-name>compilerSupports</param-name>

<param-value>true</param-value>

</jsp-param>

<jsp-param>

<param-name>encoding</param-name>

<param-value>GBK</param-value>

</jsp-param>

</jsp-descriptor>

(在Tomcat5X种也有类似的处理,在应用的web.xml文件中加上类似下面的配置项)

</jsp-config>

<jsp-property-group>

<url-pattern>*.jsp</url-pattern>

<el-ignored>true</el-ignored>

</jsp-property-group>

</jsp-config>

以上是对JSP页面编码的一些分析和处理方法,希望能对大家今后的学习和工作中有帮助!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有