中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > Web开发 > JSP > Servlets
分析并修补 resin 的中文处理
作者:未知 时间:2005-07-24 21:22 出处:JR 责编:chinaitpower
              摘要:分析并修补 resin 的中文处理
分析并修补 resin 的中文处理
请留意:以下说明基于 resin-2.1.10 ,其他版本可能并不相同。

resin 小巧,快速,稳定,广泛应用于工业强度的 web 应用。通常,大家认为是中文问题较少的一个 servlet container 。通常的解决办法是这样的,在 resin.conf 中加上:
  1.  此外,在页面上,要避免使用: 指定字符集 

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

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

static-encoding='false' (缺省值)(设置字符集没有影响)
  1.  _jsp_string1 = "\u00D6\u00D0\u00CE\u00C4".toCharArray(); 


static-encoding='true' (不设置字符集)
  1.  _jsp_string1 = "\u00D6\u00D0\u00CE\u00C4".getBytes(); 


static-encoding='true' (设置字符集GBK)
  1.  _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
  1.  ///// 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
[8)][8)][8)][8)][8)]
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有