,欢迎光临!
加入收藏设为首页请您留言
您当前位置:网站首页 >> 西北地区 >> 用过滤器实现Web网站汉字简繁体自动转换-上海联兵环保免费电话:400-600-5030

用过滤器实现Web网站汉字简繁体自动转换-上海联兵环保免费电话:400-600-5030

2011-09-13 14:11:10 来源:中国过滤器网 浏览:1

摘要:本文对网络上汉字的显示与传输进行了研究,提出一种新的在Web服务器端直接解决汉字繁简体内码转换的方案,使得只有一种内码的中文主页也可以自动地对不同内码浏览器提供支持,而不必要求客户端安装软件。这种思想在Windows NT下用IIS里的ISAPI过滤器得以实现。
关键字:Web;汉字内码;GB2312;BIG5;ISAPI
中图分类号:TP391.11
一、前言
由于历史原因,汉字的编码在大陆与香港、台湾等地存在差异,不同于系统内码的字符就不能在该系统中正常显示,由此就造成了信息共享的许多不便。随着Web的普及,大陆与港澳台的交流日益频繁,由于汉字内码不同造成Internet上中文内容发布与浏览的问题也显得越来越突出。
针对这一情况,出现了许多基于客户端的优秀软件,以解决不同内码汉字系统之间的浏览与转换。南极星、四通利方、MagicWin98、两岸通、汉字通等就是这样的内码转换工具。但是,这种客户端的解决方案要求所有客户机都装有这样的转换软件。为了使得没有安装汉字内码转换客户端的访问者也能正常浏览网站内容,许多中文网站内容提供商只好对网站内容分别制作支持不同内码的版本。比如,对于大陆的浏览者,网站提供GB内码的网页,对于香港和台湾地区的访问者,则提供BIG5内码的网页内容。
但是,对于动态网页,静态的解决方法无法奏效,特别是一些原有系统的二进制的CGI文件,只能对其源代码进行内码转换,重新编译后才能使其支持其它内码的汉字系统。如果采用逐一转换的方法,投入的工作量和难度都是巨大的。比如系统涉及到数据库,而数据是某一内码的,如GB内码,我们就还需要对数据库的信息进行转换,这会给数据的更新与维护造成许多不便。
所以,如何找到一种简单有效解决方法,从根本上解决Web站点汉字浏览问题,是一个急待解决的重要问题。
本文采用过滤法实现了对Web页面内码的自动转化。而且不同于上述方法,它是在服务器端实现,可以实现静态和动态Web网页的简繁体汉字内码的自动转换。
二、IIS的过滤器[1]
ISAPI(Internet Server Application Program Interface)过滤器则是一种强有力的增强或替换IIS(Internet Information Server)缺省行为的机制。用过滤器可以实现自定义记录、认证和加密方法,实现复杂的URL映射等等。我们则将利用ISAPI过滤器,对输入输出的数据进行转换,实现Web Server对不同汉字系统浏览器的内码的自动支持。
过滤器与传统的ISA(Internet Server Application)相当不同。ISA用于处理专用请求并且在请求URL时直接引用,类似于CGI;一个过滤器一旦安装到IIS中,就为其指定站点的所有Client请求响应。如果不显式查询请求URL,过滤器并不知道请求从哪来或者是如何产生的(例如,CGI、ISA、静态HTML等),可以形象地认为过滤器是IIS机器中的一个齿轮[2]。
2.1 过滤器的工作原理
过滤器实现上是一个事件句柄,是在IIS在HTTP请求生命周期中所定义的某一点调用。在生命周期的每一点,IIS产生一个事件,调用已经配置注册的过滤器,让它接受事件通知。在Windows NT中,一个过滤器就是一个Win32 DLL,由IIS启动时加载。IIS通过检查特别IIS注册参数,知道要加载的过滤器。过滤器一旦被成功加载,就一直驻留在Server的地址空间,直到Server终止。图1是ISAPI过滤器模型。
Microsoft Server结构是一种事件驱动模型。Server进入请求生命周期的每一阶段时,产生一个相应事件,过滤器通过截获这些事件,可在Server之前访问一个请求,提供一种有力的扩充Server办法,如制定加密和记录。
ISAPI过滤器必须引入两个过滤器的入口———GetFilterVersion和HttpFilterProc。Get-FilterVersion,是在DLL最初加载时首次调用,一般置过滤器版本和描述属性。更为重要的是,这是过滤器描述想得到的事件指示和过滤器优先级(必须根据已注册的、也接受同样指示的其他过滤器而定)的地方。同类过滤器的调用顺序由注册时分配的优先级而定。表1列出了4个优先级。多个类型相同,优先级相同的过滤器的调用顺序则是它们在注册时的排序。

QHttpFilterProc实现过滤器的真正工作,只是在它所注册的事件发生时才调用,有时这可能在GetFilterVersion调用之后。
2.2 请求调用顺序
一旦过滤器注册后,IIS就能精确地知道过滤器能够响应的事件以及在有相同类型的其他过滤器级的调用时机。当IIS处理一个HTTP请求时,以特定顺序产生一组预先定义的事件通知。如表2给出了部分事件的说明。

有上表可见,过滤器可以完全重定义IIS响应HTTP请求的方式。
一旦过滤器执行了它的任务,用返回的IIS返回码影响下一步要发生的事件。例如,一个过滤器成功处理了一个事件通知后,将期望返回SF—STATUS—REQ—HANDLED—NOTI-FICATION。这个值也告诉Server不需要为该通知作其他处理。相类似地,若过滤器检查到一个错误,应返回SF—STATUS—REQ—ERROR,于是Server要给Client返回一个出错指示。
三、用ISAPI过滤器实现Web站点汉字内码自动转换
3.1 GB与BIG5汉字内码
GB2312码[3]是中华人民共和国国家标准汉字信息交换用编码,全称《信息交换用汉字编码字符集 基本集》,标准号为GB2312-80,由中华人民共和国国家标准总局发布,1981年5月1日实施。习惯上称国标码、GB码,或区位码。它是一个简化字汉字的编码,通行于中国大陆地区,新加坡等地也使用这一编码。
GB2312-80收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共7445个图形字符。其中汉字以外的图形字符682个,汉字6763个。
GB2312-80规定,“对任意一个图形字符都采用两个字节(Byte)表示。每个字节均采用GB1988-80及GB2311-80中的七位编码表示。两个字节中前面的字节为第一字节,后面的字节为第二字节。”习惯上称第一字节为“高字节”,第二字节为“低字节”。
BIG5码[3]是通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。它并不是一个法定的编码方案,存在着一些瑕疵,业界的评价也不高,但它广泛地被应用于电脑业,尤其是国际互联网中,从而成为一种事实上的行业标准。
BIG5是一个双字节编码方案,其第一字节的值在16进制的A0~FE之间,第二字节在40~7E和A1~FE之间。因此,其第一字节的最高位是1,第二字节的最高位则可能是1,也可能是0。BIG5与GB2312的编码之间没有简单的换算公式或规律,所以,两者的转换只能采用了简单的查表法。目前网络上有大量的内码转换源代码供使用,所以这一部分功能可以直接引用这些代码。其工作原理就是通过一个GB2BIG5的码表用于GB到BIG5的转换,另一个BIG52GB的码表用于BIG5到GB的转换。
3.2 ISAPI的内码转换过滤器
1.BIG5主页输出
由于网页的内码是GB2312,所以在处理输出时只需要作GB2312到BIG5的转换,使得BIG5内码的浏览器能够正确浏览。处理步骤如下:
(1)在响应SF—NOTIFY—ULR—MAP事件的处理中,判断输入数据的Accept-Lan-guage:字段,如果是BIG5(标志zh-tw,GB的标志是zh-cn),在置转换标志位;接着判断输入数据URL里是否有/BIG5/或/big5/字段。如果有,也置转换标志位。(2)在响应SF—NOTIFY—SEND—RAW—DATA事件的处理中,判断输出Head里是否包含有html/text字段,如果有,表示是html文件,判断转换标志位是否为真,为真则缓冲输出数据;否则不作转换,正常输出转步骤5。(3)在其后的所有对SF—NOTIFY—SEND—RAW—DATA的响应中,缓冲所有的输出。当在SF—NOTIFY—SEND—RAW—DATA中已经接收到所有的发送数据后,修改页面中的charset=gb2312修改为charset=big5。调用内码转换程序,转换为BIG5内码。修改Content-length为转换后的值。将输出缓冲区指针指向转换结果的数据区。
(4)输出缓冲区给客户端的浏览器。
(5)结束。
输出的内码转换的优先级我们推荐使用高优先级(SF—NOTIFY—ORDER—HIGH)。
2.BIG5数据输入
当BIG5系统下的浏览器向Web服务器发送表单数据,进行查询等操作时,我们需要通过过滤器先将其转换为GB内码,以使得Web服务器能够正确处理。步骤如下:
(1)在响应SF—NOTIFY—READ—RAW—DATA事件的处理中,判断输入数据的是否是POST方法,如果是再判断Content-Language:字段,如果是zh-tw(表示是BIG5系统),则置转换标志位为真;接着判断输入URL里是否有/BIG5/或/big5/字段。如果有,置转换标志位为真。如果转换标志为假,转步骤6。
(2)如果转换标志位为真,则在所有的SF—NOTIFY—READ—RAW—DATA事件的处理中,缓冲所有的输入数据到转换区,输入数据指针置空。
(3)当接收数据完成,则将POST进来的结果编码(encode)的数据解码(decode),调用BIG5到GB转换函数,转换为GB码。
(4)将转换后的代码重新编码,计算长度,改变HTTP标头里的Content-length为转换后的值。
(5)将输出缓冲区指针指向转换区域,让服务器的下一个过滤器或者程序继续处理已经经过转换的表单数据。
(6)结束。
输入内码转换优先级推荐使用高优先级(SF—NOTIFY—ORDER—HIGH)。
3.词汇的转换
以上我们所说的方法解决了网页中中文内码的转换。但是,由于中国,香港,台湾等地文化与用语习惯的不同,在汉语的表达与存储上,除了其内码的差异外,许多词汇表达方式也存在差异。比如在GB的网页里“程序”在BIG5的网页里就称为“程式”,“磁盘”称为“磁碟”等。为了方便浏览者,真正保证转换的质量,我们在页面自动转换的过程中也对出现的两岸表示不同的词汇进行查找与替代,从而保证了输出的内容也可以适应浏览者阅读。在处理过程中,如果对处理速度要求高,那么简单的查找与替代就能够解决目前出现的大多数网页词汇的转换;如果希望保证转换质量,如人名不转换,地址不转换等这些特殊情况,则需要对页面的内容进行中文切词,在切词基础上,针对词汇出现的位置以及其关联词汇内容决定其转换的结果。
4.过滤器的安装
当用Visual C++编译过滤器后,生成一个DLL文件,将其安装到IIS才能使其生效。打开IIS4.0的控制台,鼠标放在需要安装过滤器的站点,点击速标邮件,查看属性,然后在弹出窗口里选择ISAPI,然后选择需要安装的过滤器。可以通过调整在IIS4.0过滤器顺序来改变同一优先级的执行顺序。
由于涉及BIG5内码转换的过滤器将对SF—NOTIFY—READ—RAW—DATA事件进行响应,其必须作为全局过滤器安装。
安装完毕后,需要重新启动服务器使过滤器工作。
四、结束语
采用ISAPI过滤器能够非常完美的解决Windows NT下IIS站点汉字内码的自动转换。对于其它Web服务器,如Netscape的Web服务器,其也支持过滤器,所以解决方法类似,对于Apache系列的Web服务器,由于其并不支持过滤器,站点的汉字内码转换则可以用插件的方式实现,但思想是一致的。
本文中的汉字内码转换过滤器已经在今年在北京举办的京港交易会的网站中使用。网站开发者只需要制作GB简体中文版本,过滤器自动对BIG5浏览器进行支持。只进行很少的设置和安装就可以提供网站的BIG5内码版本,大大节省了人力。

 

上海联兵环保科技有限公司
地址:上海市松江区工业区茸北分区茸阳路69号
总机:021-51691929
传真:021-57784244
免费电话:400-600-5030
技术支持:13641659499
E-mail:zhanglianbing@126.com
http://www.shlbhb.com

发表评论
网名:
评论:
验证:
共有0人对本文发表评论查看所有评论(网友评论仅供表达个人看法,并不表明本站同意其观点或证实其描述)
赞助商链接
关于我们 - 联系我们 - 咨询联兵