IFS

42. EBCDICでないIFSデータをRPGで読み取るには

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プログラムで読み取る方法は次回以降に
解説する。