IFSに保存されている多くのデータはEBCDICではないことが
多い。多くはUnicode(=CCSID:1200または 1208)やShift_JISなどの
ASCIIコードで保管されている。
これらのIFSデータを読み取って表示したい場合は
API: QDCXLATE ではできない場合が多い。
_
QDCXLATEではASCIIからEBCDICへの変換はできるが
UnicodeからEBCDICへの変換はできない。
UnicodeからEBCDICへ変換するには iconv というUNIX系のAPIを
使わなければならないのだが iconv の使用は2段階の処理が
必要で大変複雑な処理を必要とする。
もっと簡単な方法でIFSデータを読み取ることはできないのだろうか?
ここではオープンして読み取るだけで自動的にUnicodeの文字列を
EBCDICにi5/OSが変換してくれる方法を紹介しよう。
もちろん日本語漢字も正しく変換される。
これは次期製品に使われている高度な処理である。
_
H DFTNAME(DSPPTNSRC) DATEDIT(*YMD/) BNDDIR('QC2LE') : D FD S 10I 0 FILE 記述子 D DATA S 1000C CCSID(1200) D OPEN_ PR 10I 0 EXTPROC('open') D PATH * VALUE D FLAG 10I 0 VALUE D MODE 10I 0 VALUE OPTIONS(*NOPASS) D CODEPAGE 10I 0 VALUE OPTIONS(*NOPASS) D TOPAGE 10I 0 VALUE OPTIONS(*NOPASS) D O_CCSID S 10I 0 INZ(32) D O_RDONLY S 10I 0 INZ(1) D O_TEXTDATA S 10I 0 INZ(16777216) : C*----------------------------------------------------+ C *ENTRY PLIST C PARM PROJECT 132 C*----------------------------------------------------+ /FREE FD = OPEN_(%ADDR(PROJECT): O_TEXTDATA + O_RDONLY + O_CCSID:0:5035); EXSR READ; /END-FREE :
[解説]
最初にH-仕様書で BNDDIR(‘QC2LE’) を定義することによって
C言語のライブラリー関数がRPGでも使用可能になる。
OPEN_ PR 10I 0 EXTPROC('open')
というのがC言語の open関数である。
PROJECTという変数は「/PYTHON/PROJECT/WSHOHIN/WSHOHIN.PY」のような
IFSファイルのフル・パス名である。
open関数を条件つきでオープンすることによってテキスト・データを
CCSID:5035に変換するように指示している。
O_RDONLYとは読み取りモードでオープンすることを意味し
O_TEXTDATAとO_CCSID:0:5035でCCSID=1208(Unicode8)で保管されているデータを
CCSID:5035のデータに変換することを指示している。
たったこれだけのオープン命令でオープンして読み取るだけで
CCSID:1208(=Unicode8)のデータがEBCDICに変換される。
_
次にIFSのストリーム・ファイルをRPGで読み取ることになるのだが
ストリーム・ファイル(STMF)はDB2/400のようにレコード・レベルで読み取る
ことはできない。
ストリーム・ファイル(STMF)をRPGプログラムで読み取る方法は次回以降に
解説する。