CL

77. API: QDCXLATE コード変換

EBCDIC/ASCII コードの変換に最も利用されるのが API : QDCXLATE である。
既に使った経験のある人も少なくはないだろう。
ここでは QDCXLATE の使用方法と一般には知られていない変換テーブルについても紹介しよう。

データの変換 (QDCXLATE) API

パラメータ

必須パラメータ:

1.変換前のデータの長さ入力Packed(5,0)
2.変換前のデータ入出力Char(*)
3.SBCS 変換テーブル名入力Char(10)

任意選択パラメータ:

4.SBCS 変換テーブル・ライブラリー名入力Char(10)
5.変換されたデータ出力Char(*)
6.変換データの長さ入力Packed(5,0)
7.変換されたデータの長さ出力Packed(5,0)
8.DBCS 言語入力Char(10)
9.シフトアウトおよびシフトイン文字入力Char(10)
10.変換のタイプ入力Char(10)

1. 変換するデータの長さ

変換データが定義されている長さを宣言します。

2. 変換後のデータ

変換後のデータは、この変数に戻されます。

3. SBCS 変換テーブル名

変換のために使用するテーブルを指定します。
通常は

EBCDIC --> ASCII への変換テーブル: QSYS/QASCII
ASCII --> EBCDIC への変換テーブル: QSYS/QEBCDIC

を指定しますが TCP/IP 通信では

EBCDIC --> ASCII への変換テーブル: QUSRSYS/QTCPASC
ASCII --> EBCDIC への変換テーブル: QUSRSYS/QTCPEBC

を使用します。

4. SBCS 変換テーブル・ライブラリー名

SBCS 変換テーブルのあるライブラリー名前を指定します。

5. 変換されたデータ

変換後のデータが入る変数を指定します。

6. 変換データの長さ

上記の「変換されたデータ」の変数が定義されている長さを宣言します。

7. 変換されたデータの長さ

実際に変換された後の長さがここに戻されます。

8. DBCS 言語

言語の種類を指定します。次のいずれかの値を指定してください。

*JPN・・・・・・日本語
*KOR・・・・・・韓国語
*CHS・・・・・・中国語(簡体字)
*CHT・・・・・・中国語(繁体字)
*BG5・・・・・・台湾
*KSC・・・・・・韓国業界標準
*SCGS・・・・・・中華人民共和国業界標準
*J9OX5035・・・・・・CCSID : 1399 の変換を指定

9. シフトアウトおよびシフトイン文字

変換後の文字列にシフト文字を漢字の文字列の両端に挿入するかどうかを指定します。

Y・・・・・・シフト文字を挿入する。
N・・・・・・シフト文字を挿入しない。

10. 変換のタイプ

変換の向きを指定します。

*AE・・・・・・ASCII --> EBCDIC に変換します。
*EA・・・・・・EBCDIC --> ASCII に変換します。
【例 サンプル・サース : TESTDCX】
0001.00              PGM
0002.00 /*---------------------------------------------------------*/
0003.00 /*   TESTDCX  :  QDCXLATE のテスト                         */
0004.00 /*                                                         */
0005.00 /*   CRTCLPGM MYLIB/TESTDCX SRCFILE(MYSRCLIB/QCLSRC)       */
0006.00 /*   AUT(*ALL)                                             */
0007.00 /*---------------------------------------------------------*/
0008.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(80)
0009.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)
0010.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)
0011.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0012.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
0013.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)
0014.00              DCL        VAR(&EBCBUF) TYPE(*CHAR) LEN(5000)
0015.00              DCL        VAR(&EBCLEN) TYPE(*CHAR) LEN(3) +
0016.00                           VALUE(X'00006F') /* 5 桁 PACK */
0017.00              DCL        VAR(&ASCBUF) TYPE(*CHAR) LEN(5000)
0018.00              DCL        VAR(&ASCLEN) TYPE(*CHAR) LEN(3) +
0019.00                           VALUE(X'05000F') /* 5 桁 PACK */
0020.00              DCL        VAR(&MAXOTL) TYPE(*CHAR) LEN(3) +
0021.00                           VALUE(X'05000F') /* 5 桁の PACK 形式  +
0022.00                            変換用 */
0023.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0024.00
0025.00              RTVJOBA    TYPE(&TYPE)
0026.00              CHGVAR     VAR(&EBCBUF) VALUE('ABC123')
0027.00              CALL       PGM(QDCXLATE) PARM(&EBCLEN &EBCBUF 'QASCII  +
0028.00                           ' 'QSYS    ' &ASCBUF &MAXOTL &ASCLEN +
0029.00                           '*JPN ' 'N' '*EA ')
0030.00              SNDPGMMSG  MSG(&EBCBUF *TCAT +
0031.00                           ' を ASCII に変換しました。 ') MSGTYPE(*DIAG)
0032.00              RETURN
0033.00
0034.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +
0035.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
0036.00                           MSGFLIB(&MSGFLIB)
0037.00  SNDMSG:
0038.00              IF         COND(&TYPE *EQ '0') THEN(DO)
0039.00              SNDPGMMSG  MSG(&MSG) TOMSGQ(*TOPGMQ) MSGTYPE(*COMP)
0040.00              ENDDO
0041.00              ELSE       CMD(DO)
0042.00              IF         COND(&MSGID *EQ ' ') THEN(DO)
0043.00              SNDPGMMSG  MSG(&MSG) TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG)
0044.00              ENDDO
0045.00              ELSE       CMD(DO)
0046.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
0047.00                           MSGDTA(&MSGDTA) TOMSGQ(*TOPGMQ) +
0048.00                           MSGTYPE(*ESCAPE)
0049.00              ENDDO
0050.00              ENDDO
0051.00              ENDPGM
【解説】
0027.00              CALL       PGM(QDCXLATE) PARM(&EBCLEN &EBCBUF 'QASCII  +
0028.00                           ' 'QSYS    ' &ASCBUF &MAXOTL &ASCLEN +
0029.00                           '*JPN ' 'N' '*EA ')

は 変数 &EBCBUF*EA のようにEBCDIC --> ASCII へ変換して結果を &ASCBUF に戻します。
&ASCBUF に戻された長さは &ASCLEN です。

【QDCXLATE の使用上の注意】

QDCXLATE は EBCDIC/ASCII の変換においてよく利用されているが
次の問題点があることを承知しておく必要がある。

実行速度が遅い

QDCXLATE は実行速度が遅い。
大量の変換を繰り返し行ない、パフォーマンスーが要求される適用業務には向いていない。
Webアプリケーションのようなパフォーマンスが重要となる業務には向いていない。
独自の変換API を作成すべきである。

バグがある

テーブルの問題のせいか、すべての文字が正しく変換されるわけではない。
半角カナや特殊記号、漢字等の変換に問題がある場合がある。
実行結果をそのまま信頼することはできない。
適用業務に組み込むのであれば十分なテストが必要である。