网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  分析并修补 resin 的中文处理     
  文章作者:未知  文章来源:水木森林  
  查看:71次  录入:管理员--2007-11-17  
 
  分析并修补 resin 的中文处理

请留意:以下说明基于 resin-2.1.10 ,其他版本可能并不相同。

resin 小巧,快速,稳定,广泛应用于工业强度的 web 应用。通常,大家认为是中文问题较少的一个 servlet container 。通常的解决办法是这样的,在 resin.conf 中加上:

<jsp precompile=´true´ static-encoding=´true´ recompile-on-error=´true´/>此外,在页面上,要避免使用: <%@ page contenttype="text/html; charset=gbk"%> 指定字符集

应该说,这个配置能解决大部分的中文显示问题(能解决问题,但并非真正解决了问题,细节容后再叙)。直到前不久,因为在项目中应用一个 mvc 框架,中文问题才再次不可调和的浮现出来。深入代码,发现 resin 在处理中文时,其实是存在问题的。

我们来看一下“static-encoding=´true´”和“不作字符集指定”是如何让中文正常显示的。在 web-inf 的 work 目录下,通常可以找到 resin 根据 jsp 生成的 java 代码。jsp中的字符串:"中文",在生成 java 文件的时候,这个字符串的转换会有这么几种情况:

static-encoding=´false´ (缺省值)(设置字符集没有影响)

_jsp_string1 = "/u00d6/u00d0/u00ce/u00c4".tochararray();

static-encoding=´true´ (不设置字符集)

_jsp_string1 = "/u00d6/u00d0/u00ce/u00c4".getbytes();

static-encoding=´true´ (设置字符集gbk)

_jsp_string1 = "/u00d6/u00d0/u00ce/u00c4".getbytes("gbk");

我们知道,字符串"中文"在正确的转换应该是"/u4e2d/u6587"长度为2(可以运行native2ascii 输入"中文" 进行检查),在jsp处理的第一个环节,上面各种情况下生成的 java 代码,"中文"字符串都是被错误转换的。也就是说,在 jsp 被转换成为 java 文件的时候,出现了编码错误。那么为什么,在“static-encoding=´true´ (不设置字符集)”的情况下,它能正常显示呢?

在“static-encoding=´true´ (不设置字符集)”的情况下,采用默认的iso-8859-1编码方式,两个双字节编码的gbk中文字符被当作四个字节处理,必须注意到,此时,一个中文字符被拆为两个“字节字符”来处理,字符串的长度是错误的。在显示的时候,按照默认的iso-8859-1方式编码返回给浏览器。此时,单字节流被浏览器自动识别,认出是gbk格式,从而可以正常显示。也就是说,此时的正常显示实际上是利用了iso-8859-1和unicode相互转换时按单字节处理的特点(不进行转码处理),将错就错的实现了中文的正常显示。

我们定位了问题,是在 jsp 被转换成为 java 文件的时候出现了编码错误。那么如何使jsp中的中文能正确的生成java文件?我跟踪了 resin 的源代码,找到了一个可行,但也许不是最好的解决办法。

jspparser.java of resin-2.1.10

///// added by jackyz private static string sysencoding = system.getproperty("file.encoding"); page parse(path path, string uri, string classname, string uripwd, cauchorequest req, cauchoapplication app) throws exception { readstream stream = path.openread(); ///// added by jackyz stream.setencoding(sysencoding); try { return parse(stream, uri, classname, uripwd, path.getparent(), req, app); } catch (filenotfoundexception e) { throw e; } catch (ioexception e) { if (path.isdirectory()) throw new filenotfoundexception(path.tostring()); else throw e; } finally { stream.close(); } }

新修改下,加上页面的gbk编码,java程序中定义的中文字符可以正常显示,url和form传递的gbk中文也能正常处理。

记得修改之后编译并更新resin.jar使这个修改生效。

参考方法:
先获取 resin-2.1.10 的源代码
cd $resin_home/src
javac -classpath ../lib/resin.jar;../lib/jsdk23.jar com/caucho/jsp/jspparser.java
jar uvf ../lib/resin.jar com/caucho/jsp/*.class

此 bug 和修改已经提交到resin的bugtrace

*******************************************************************************
作者:jackyz
email: jackyz[at]163.net
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
*******************************************************************************

 
 
上一篇: 防止用户非法登录又一法    下一篇: 分享swing学习的一些经验
  相关文档
与垃圾收集器(garbage collector)为伴 11-17
java和.net两个平台对于安全功能的比较 11-16
更好的捕捉鼠标事件 11-17
jdk配置问题 11-17
getutcfullyear 方法 11-16
i/o及网络--md5加密及java的实现方式 01-10
jaas 实现in struts web app,使用xmlpolicy文件,不改变vm安全.. 11-17
新手入门:关于java的classpath详解 11-17
怎么使用dbms存储过程 11-17
java指南之使用图形:使用图像 11-17
java中文内部乱码处理 11-17
拷贝枚举器以加强效率 11-16
oracle rac on sun cluster 3.1(step by step) 11-17
新手入门:在jsp页面中的几种传参方式 11-16
请不要做浮躁的人 11-17
使用annotations设计一个mvc框架 11-17
java 事例教程(1) 11-17
.net中实现彩色光标,动画和自定义光标 11-17
使用xmlhttp和java session监听改善站内消息系统 11-17
javabean调用示例 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息