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