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