AS/400采用EBCDIC编码保存在QSYS.LIB中的所有中文字符,而在pc端winows 95,windows NT采用GBK内码保 存中文字符,两者之间在进行中文数据传输的时候,会遇到EBCDIC和GBK的相互转换。有两种方法,一种是手工构造码表进行转换,一种是使用jtopen, IBM Toolbox for Java的开源版本进行转换,本文介绍第二种方法。

jtopen 类库

jtopen的官方网站:http://jt400.sourceforge.net/,jtopen提供了一个java工具类库,使用该类库可以方便的对IBM I ( i5/OS or OS/400)系列服务器进行访问或者提供数据操作。

转换EBCDIC码与GBK使用jtopen的类,对应jt400.jar

import com.ibm.as400.access.AS400Text;

EBCDIC码各语言的码表网址:

http://publib.boulder.ibm.com/infocenter/iadthelp/v7r0/index.jsp?topic=/com.ibm.etools.iseries.toolbox.doc/ccsidlist.htm

其中中文变长字节Mixed-byte EBCDIC为1388,双字节Double-byte EBCDIC为4933,对应GBK字符集

EBCDIC码是一种字节码,因此保存形式为字节数组,这点请注意。

以下简单举例EBCDIC与GBK之间互转的方法:

EBCDIC转GBK

假设读取AS/400输入的EBCDIC字节码数组为message

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
      byte[] message ;

      int codePage=1388;//中文码表

      //声明转换类,其中codePage为需要转换至的码表

      AS400Text converter = new AS400Text(message.length,codePage);

      //resultedText即为转换后的GBK字符串

      String resultedText = (String)converter.toObject(message);

      System.out.println("resultedText=" + resultedText);

GBK转EBCDIC码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
        String strGbk="这是中文1213测试!";

        //这里字节数组的长度要大等于转换结果的EBCDIC码的字节数

        byte[]  bytesData =new byte[1500];

        int codePage=1388;

        AS400Text converter = new AS400Text(bytesData.length,codePage);

        //bytesData即为转换为EBCDIC码的字节数组,可以直接发送给AS/400

        bytesData =converter.toBytes(strGbk);

以上备忘,仅供参考!