<%-- JSP全站自动生成HTML下载新闻系统 V3.1 作者:JSP天空网站长 曹进 QQ:173241393 --%> 分析并修补 resin 的中文处理
 
用户名:
密码:
终身会员
  首页 网络文摘 技术专题 下载中心 JSP培训 公司产品 JSP虚拟主机 技术论坛 会员 JSP免费空间  
  技术文摘: JSP基础 | JSP高级 | JSP环境 | JAVA基础 | JAVA高级 | JAVA工具 | JAVA数据库 | WEB框架 | XML相关 | JAVA考试 | J2EE相关 | J2ME相关 |
  视频下载: 程序设计数据库相关教程计算机基础教程图形图像网络技术网络安全时空书库EasyShop虚拟主机JSP培训技术论坛
  书籍教程: JSP教程Java教程图像软件XML教程数据库教程网页教程工具软件服务器相关ASP教程PHP教程CGI教程.NET教程
  代码下载: ASP代码下载JSP代码下载PHP代码下载CGI代码下载Flash代码C/C++/VCPowerBuilderDelphiVisualBasicVisualFoxpro
您的位置: 首页 -> 文章分类 -> JAVA工具 -> 分析并修补 resin 的中文处理
 文摘搜索
 
 文摘资源分类
 
 文摘总排行榜TOP10
 
 最新更新文摘TOP10
 

分析并修补 resin 的中文处理

[来源]www.jspsky.com管理员   [作者]网络文摘   [时间]2005-4-8
推荐等级: 点击:
请留意:以下说明基于 resin-2.1.10 ,其他版本可能并不相同。

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


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

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

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

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

_jsp_string1 = "u00D6u00D0u00CEu00C4".toCharArray();


static-encoding=&acute;true&acute; (不设置字符集)

_jsp_string1 = "u00D6u00D0u00CEu00C4".getBytes();


static-encoding=&acute;true&acute; (设置字符集GBK)

_jsp_string1 = "u00D6u00D0u00CEu00C4".getBytes("GBK");


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

在“static-encoding=&acute;true&acute; (不设置字符集)”的情况下,采用默认的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
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
******************************************************************************* 
[收藏][打印][关闭]
在线咨询服务 在线咨询服务 在线咨询服务 在线咨询服务
Copyright©2005-2006陕西思远数码科技有限责任公司 服务电话:029-88212987 传真:029-88278265 售后服务QQ:173241393
地址:陕西省西安市吉祥路186号太白新苑C座2104 陕ICP备05004508号