陳曉宇
同濟大學軟件學院,上海 201804
IBM的大型主機經(jīng)歷了近50多年的發(fā)展,至今依然運行在各大公司的關鍵性任務上。但面對靈活多變的開放平臺,大型機系統(tǒng)仍然需要吸取其優(yōu)點,因此,IBM公司的SOA戰(zhàn)略在此展現(xiàn)出來的就是賦予大型機連接、管理,借用開放平臺的能力。
IMS系統(tǒng)全稱為Information Management System,是主機系統(tǒng)上出現(xiàn)的第一代數(shù)據(jù)庫系統(tǒng)和交易管理系統(tǒng),它的數(shù)據(jù)庫管理系統(tǒng)是一種層次型數(shù)據(jù)庫, 同時還具有交易管理系統(tǒng)的功能,即Transaction management。
為了IMS系統(tǒng)提供SOA增強,使的它能更好的與開放平臺相聯(lián)系,這樣就能更好的重用現(xiàn)存的資產(chǎn)。IBM提供了一整套名為IMS SOA Intergration Suite的產(chǎn)品,它是一組IMS中間件產(chǎn)品和工具的集合,你可以利用它來在互聯(lián)性,數(shù)據(jù)表現(xiàn),應用開發(fā)和web訪問方面現(xiàn)代化你原有的IMS應用程序。它包括了:
IMS MFS Web Solutions, IMS TM Resource Adapter,等等許多工具。
在開發(fā)其中的IMS MFS Web Solution時,我們遇到了瀏覽器與IMS系統(tǒng)在漢字編碼方面的問題,在我們的實驗當中找到了合適的解決方法,并記錄成文。
MFS是IMS TM中的一項功能,主要是為了定義終端顯示與消息格式,使得應用程序開發(fā)人員不必處理顯示界面的問題。而MFS Web Solution又是為了使用web訪問替代傳統(tǒng)的終端訪問,具體實現(xiàn)是開放平臺的web server通過TM Resource Adapter 與主機端的IMS Connect相連接。
主機系統(tǒng)使用英文編碼EBCDIC本身可以很好的支持英文字符的轉換,因為都是單字節(jié)字,但是當我們使用漢字時,情況有所不同。在主機系統(tǒng)內(nèi),包括漢字在內(nèi)的統(tǒng)稱為DBCS(Double Byte Character Sets),合法的DBCS字符,第一字節(jié)和第二字節(jié)的長度同為0x41到0xFE。
我們的主機是如何處理DBCS/EBCDIC混合情況的呢?它會在每個DBCS數(shù)據(jù)前面加上一個Shift out即0x0E,然后在結尾加上一個Shift in即0x0F表示這是一個DBCS數(shù)據(jù)。但要怎樣才能真正的做到在開放平臺輸入漢字能夠正確的被主機IMS系統(tǒng)認識并處理,返回正確的結果,還需研究下面兩個問題
如何在我們的MFS Web上能夠正確的輸入漢字,并傳入主機經(jīng)過處理又正確的顯示出來呢?
在主機以外的環(huán)境我們需要統(tǒng)一編碼為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系統(tǒng)讀入和讀出字符都將編碼為utf-8。
然后最重要的一點是處理與主機通信時的編碼。經(jīng)過查找資料,我們發(fā)現(xiàn),主機系統(tǒng)內(nèi)的簡體漢字編碼采用的DBCS字符集為CP935,繁體采用的為CP937,這樣在我們將字符轉化成字節(jié)流傳給主機時需要處理成主機認可的編碼,在我們這個系統(tǒng)中,轉換發(fā)生在函數(shù)
write(MFSMessageField messageField, int option, OutputStream ostream)其中的:
byte[] messageFieldBytes = messageFieldValue.getBytes(codepage);
這里codepage需要設置成為CP935
這樣當我們輸入DISPLAY命令和所需查詢的用戶名cxy1時,能夠正確的返回之前相同頁面添加進去的“陳”字。
當我們正確的處理了上面一個問題,又會遇到一個特別的問題,比如我們輸入“豫”這個字,結果傳回來顯示確是“藻”。還有同樣的例子,比如“萬”顯示成了“臥”。
經(jīng)過仔細的研究,發(fā)現(xiàn),萬在cp935中編碼為 1110 1010111 10010011 1111 而豫編碼為 1110 1011010 10100100 1111 .
,在從utf-8到cp935的轉換過程中,編碼一直正確,但是當他們從主機端返回時,編碼卻變成了 1110 1010111 11010011 1111和 1110 1011010 11100100 1111 請注意加重的部分,這表示在同樣的這一位,由0變成了1.這又是什么原因造成的呢。通過對資料的檢索,發(fā)現(xiàn)在 Chapter 4 DFSUPAA0 in IMS v11 System Utilities 中提到說
由此可見萬字的第二個字節(jié) 10010011 屬于 x'91' - x'99'. 所以它被當作EBCDIC碼轉換成了大寫字母變成 11010011.
這樣我們只要將系統(tǒng)中GRAPHIC=設為NO即可。
本文論述了主機系統(tǒng)字符集相關概念,解決了開發(fā)IMS Web模擬程序過程中遇到的兩個典型問題,由此IMS SOA系統(tǒng)已經(jīng)可以正常的處理和使用漢字,這樣就為我們重用現(xiàn)有的資源,擴大IMS系統(tǒng)靈活性提供了便利。
[1]GrayWicks,EgideVanAerschot.PowerSOASolutionswithIMS.IBMPRESS,2009,3.
[2]翟凌慧,馬少平.IBM大型機與小型機間漢字轉換解決方案[J].中文信息學報,2001,15(6).