大型机IMS系统与开放平台汉字转换问题研究
2010-04-18陈晓宇
陈晓宇
同济大学软件学院,上海 201804
0 引言
IBM的大型主机经历了近50多年的发展,至今依然运行在各大公司的关键性任务上。但面对灵活多变的开放平台,大型机系统仍然需要吸取其优点,因此,IBM公司的SOA战略在此展现出来的就是赋予大型机连接、管理,借用开放平台的能力。
IMS系统全称为Information Management System,是主机系统上出现的第一代数据库系统和交易管理系统,它的数据库管理系统是一种层次型数据库, 同时还具有交易管理系统的功能,即Transaction management。
1 应用背景
为了IMS系统提供SOA增强,使的它能更好的与开放平台相联系,这样就能更好的重用现存的资产。IBM提供了一整套名为IMS SOA Intergration Suite的产品,它是一组IMS中间件产品和工具的集合,你可以利用它来在互联性,数据表现,应用开发和web访问方面现代化你原有的IMS应用程序。它包括了:
IMS MFS Web Solutions, IMS TM Resource Adapter,等等许多工具。
在开发其中的IMS MFS Web Solution时,我们遇到了浏览器与IMS系统在汉字编码方面的问题,在我们的实验当中找到了合适的解决方法,并记录成文。
MFS是IMS TM中的一项功能,主要是为了定义终端显示与消息格式,使得应用程序开发人员不必处理显示界面的问题。而MFS Web Solution又是为了使用web访问替代传统的终端访问,具体实现是开放平台的web server通过TM Resource Adapter 与主机端的IMS Connect相连接。
主机系统使用英文编码EBCDIC本身可以很好的支持英文字符的转换,因为都是单字节字,但是当我们使用汉字时,情况有所不同。在主机系统内,包括汉字在内的统称为DBCS(Double Byte Character Sets),合法的DBCS字符,第一字节和第二字节的长度同为0x41到0xFE。
我们的主机是如何处理DBCS/EBCDIC混合情况的呢?它会在每个DBCS数据前面加上一个Shift out即0x0E,然后在结尾加上一个Shift in即0x0F表示这是一个DBCS数据。但要怎样才能真正的做到在开放平台输入汉字能够正确的被主机IMS系统认识并处理,返回正确的结果,还需研究下面两个问题
2 问题及解决方案
2.1 问题一
如何在我们的MFS Web上能够正确的输入汉字,并传入主机经过处理又正确的显示出来呢?
在主机以外的环境我们需要统一编码为UTF-8.
首先我们htm l页面的编码需要设成UTF-8,然后将Servlet中在 PrintWriter out = response.getWriter(); 之前添加如下代码,表示同样使用UTF-8编码
request.setCharacterEncoding("UTF-8");// add
response.setContentType("text/htm l; charset=utf-8");// add
这样,web系统读入和读出字符都将编码为utf-8。
然后最重要的一点是处理与主机通信时的编码。经过查找资料,我们发现,主机系统内的简体汉字编码采用的DBCS字符集为CP935,繁体采用的为CP937,这样在我们将字符转化成字节流传给主机时需要处理成主机认可的编码,在我们这个系统中,转换发生在函数
write(MFSMessageField messageField, int option, OutputStream ostream)其中的:
byte[] messageFieldBytes = messageFieldValue.getBytes(codepage);
这里codepage需要设置成为CP935
这样当我们输入DISPLAY命令和所需查询的用户名cxy1时,能够正确的返回之前相同页面添加进去的“陈”字。
2.2 问题二
当我们正确的处理了上面一个问题,又会遇到一个特别的问题,比如我们输入“豫”这个字,结果传回来显示确是“藻”。还有同样的例子,比如“万”显示成了“卧”。
经过仔细的研究,发现,万在cp935中编码为 1110 1010111 10010011 1111 而豫编码为 1110 1011010 10100100 1111 .
,在从utf-8到cp935的转换过程中,编码一直正确,但是当他们从主机端返回时,编码却变成了 1110 1010111 11010011 1111和 1110 1011010 11100100 1111 请注意加重的部分,这表示在同样的这一位,由0变成了1.这又是什么原因造成的呢。通过对资料的检索,发现在 Chapter 4 DFSUPAA0 in IMS v11 System Utilities 中提到说
由此可见万字的第二个字节 10010011 属于 x'91' - x'99'. 所以它被当作EBCDIC码转换成了大写字母变成 11010011.
这样我们只要将系统中GRAPHIC=设为NO即可。
3 结论
本文论述了主机系统字符集相关概念,解决了开发IMS Web模拟程序过程中遇到的两个典型问题,由此IMS SOA系统已经可以正常的处理和使用汉字,这样就为我们重用现有的资源,扩大IMS系统灵活性提供了便利。
[1]GrayWicks,EgideVanAerschot.PowerSOASolutionswithIMS.IBMPRESS,2009,3.
[2]翟凌慧,马少平.IBM大型机与小型机间汉字转换解决方案[J].中文信息学报,2001,15(6).