- 「メインフレーム・コンピューター」で遊ぼう - http://www.arteceed.net -

FTPによる日本語データの転送(z/OS)

FTPによる日本語データの転送(z/OS)

漢字など日本語文字を含むメインフレームのデータをPC側に転送する際の文字コード変換方法。

転送にはFTPを使用する。3270エミュレーターのファイル転送でもよいが、z/OSのFTPには文字コード変換に加えて、メインフレーム特有のSO/SIコードによる桁ずれを考慮したオプション追加されているため使いやすい。
紹介したサンプルは、メインフレーム側がFTPクライアント、PC側がFTPサーバーである。運用上FTPサーバーが使えないz/OSシステムが多いが、FTPクライアントであれば、サーバーと違ってシステムに常駐させる必要がなくJCLから簡単に実行できる。代わりにPC側でFTPサーバーを動かす必要があるが、フリーのソフトも多く入手には困らないであろう。文字コード変換やメインフレーム特有の処理は、z/OS側のFTPクライアントで行うため、PC側のFTPサーバーはWindowsやLinuxで利用されている一般のソフトウェアで対応できる。

    シフトJISコードに変換してz/OSからPCへデータを転送する

    //*********************************************************************
    //*        Sample JCL for FTP File Transmission
    //*        ====================================
    //*        TRANSLATE IBM-KANJI TO SHIFT-JIS
    //*********************************************************************
    //FTP      EXEC PGM=FTP,PARM='(EXIT'
    //SYSPRINT DD SYSOUT=*
    //SYSTCPD  DD *
    LOADDBCSTABLES SJISKANJI
    //SYSIN    DD *
    000.000.000.000
    FTPUSER FTPUSER
    LOCSITE FWF    <--- FireWall Friendly(Passiveモードを示す)
    SJISKANJI (NOTYPE
    PUT 'PRJ1.DATA01' ZOS.DBCSDATA-1.txt
    SJISKANJI (NOTYPE SOSI ASCII
    PUT 'PRJ1.DATA01' ZOS.DBCSDATA-2.txt
    SJISKANJI (NOTYPE SOSI EBCDIC
    PUT 'PRJ1.DATA01' ZOS.DBCSDATA-3.txt
    SJISKANJI (NOTYPE SOSI SPACE
    PUT 'PRJ1.DATA01' ZOS.DBCSDATA-4.txt
    QUIT
    //
    

    IBM漢字コードからシフトJISコードに変換するには、PUTコマンドの前にSJISKANJコマンドを指示する。
    SOSIオプションは、漢字コードの前後にあるSO/SIコードをコード変換時に取り除かずに残すことを示す。ASCII、EBCDIC、SPACEはその残し方である。ASCIIの場合、SO(x0E)はx1E、SI(x0F)はx1Fにそれぞれ置き換えられる。x1Eは→、x1Fは←で表示される(対応できないソフトもある)。EBCDICの場合、元のSO(x0E)とSI(x0F)が変換されずにそのまま残る。SOとSIで囲まれた漢字部分はシフトJISに変換される。SPACEの場合、SO(x0E)とSI(x0F)は空白文字(x20)に置き換えられる。これらによってSO/SIコードの部分がバイトデータとして残るため、表示上の桁ずれが起きなくなる。PC上でも桁位置を合わせて内容を確認したい場合に便利である。

    LOCSITE TRAIL
    SJISKANJI (NOTYPE SOSI ASCII
    PUT 'TK.JCL(DBCSDATA)' ZOS.DBCSDATA-5.txt
    

    転送前に、LOCSITEコマンドでTRAILを指示しておくと、固定長レコードの後方ブランク文字を削除せずにそのまま転送する。コード変換はするが、レコードの長さは変えない、といった場合に利用できる。
    ※テキスト・データなので各レコードの末尾に改行コード(x0D0A)だけは付加される。

    //SYSIN    DD *
    192.168.1.127
    FTPUSER FTPUSER
    LOCSITE FWF
    SJISKANJI (NOTYPE
    GET ZOS.DBCSDATA-1.txt 'PRJ1.DATA01' (REPLACE
    SJISKANJI (NOTYPE SOSI ASCII
    GET ZOS.DBCSDATA-2.txt 'PRJ1.DATA02' (REPLACE
    SJISKANJI (NOTYPE SOSI EBCDIC
    GET ZOS.DBCSDATA-3.txt 'PRJ1.DATA03' (REPLACE
    SJISKANJI (NOTYPE SOSI SPACE
    GET ZOS.DBCSDATA-4.txt 'PRJ1.DATA04' (REPLACE
    SJISKANJI (NOTYPE SOSI ASCII
    GET ZOS.DBCSDATA-5.txt 'PRJ1.DATA05' (REPLACE
    QUIT
    //
    

    ダウンロードしたデータをメインフレーム側に戻す場合は、同じJCLを再使用してPUTコマンドをGETコマンドに替えればよい。ただし、ファイル名の記述位置は逆になる。


    EUCコードに変換してz/OSからPCへデータを転送する

    シフトJISではなく、EUCコードに変換する場合は、上記サンプルJCL中の「SJIS」を「EUC」に置き換えて使用すればよい。

    //*********************************************************************
    //*        Sample JCL for FTP File Transmission
    //*        ====================================
    //*        TRANSLATE IBM-KANJI TO EUC
    //*********************************************************************
    //FTP      EXEC PGM=FTP,PARM='(EXIT'
    //SYSPRINT DD SYSOUT=*
    //SYSTCPD  DD *
    LOADDBCSTABLES EUCKANJI
    //SYSIN    DD *
    000.000.000.000
    FTPUSER FTPUSER
    LOCSITE FWF
    EUCKANJI (NOTYPE
    PUT 'PRJ1.DATA01' ZOS.DBCSDATA-1.txt
    EUCKANJI (NOTYPE SOSI ASCII
    PUT 'PRJ1.DATA01' ZOS.DBCSDATA-2.txt
    EUCKANJI (NOTYPE SOSI EBCDIC
    PUT 'PRJ1.DATA01' ZOS.DBCSDATA-3.txt
    EUCKANJI (NOTYPE SOSI SPACE
    PUT 'PRJ1.DATA01' ZOS.DBCSDATA-4.txt
    QUIT
    //
    

    UNICODEに変換してz/OSからPCへデータを転送する

    z/OSのFTPクライアントは、unicode文字に変換することもできる。UTF-8ではないので、SBCS文字も含めて1文字2バイトに変換されるためファイルサイズは大きくなる。ただし、WindowsやLinuxなど多くのプラットフォームで共通に利用できる。

    //*********************************************************************
    //*        Sample JCL for FTP File Transmission
    //*        ====================================
    //*        TRANSLATE IBM-KANJI TO UNICODE(UCS2)
    //*********************************************************************
    //FTP      EXEC PGM=FTP,PARM='(EXIT'
    //* //SYSTCPD  DD *              <--- SYSTCPD DDステートメントは
    //* LOADDBCSTABLES SJISKANJI     <--- 不要
    //SYSPRINT DD SYSOUT=*
    //SYSIN    DD *
    000.000.000.000
    FTPUSER FTPUSER
    LOCSITE FWF
    SENDSITE
    UCS2 (NOTYPE
    LOCSITE NOUCSTRUNC NOUCSSUB UCSHOSTCS=IBM-939
    PUT 'PRJ1.DATA01' ZOS.DBCSDATA-9.txt
    QUIT
    //*-------------------------------------------------------------------*
    //FTP      EXEC PGM=FTP,PARM='(EXIT'
    //SYSPRINT DD SYSOUT=*
    //SYSIN    DD *
    000.000.000.000
    FTPUSER FTPUSER
    LOCSITE FWF
    SENDSITE
    UCS2 (NOTYPE
    LOCSITE NOUCSTRUNC NOUCSSUB UCSHOSTCS=IBM-939
    GET ZOS.DBCSDATA-9.txt 'PRJ1.DATA02' (REPLACE
    QUIT
    //
    

    このサンプルは、変換後のコード・データをビッグエンディアンで並べるが、リトルエンディアンで並べる場合は、「UCS2 (NOTYPE LITTLE」と指定すればよい。

FTPクライアントの詳細は、マニュアル「z/OS Communications Server IP ユーザーズ・ガイドとコマンド(SC88-8931)」およびRedbook「IBM z/OS V1R13 Communications Server TCP/IP Implementation: Volume 2 Standard Applications(SG24-7997)」に載っている。