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 zos.dbcsdata-2.txt sjiskanji ebcdic put zos.dbcsdata-3.txt sjiskanji space put 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ステートメントは >このサンプルは、変換後のコード・データをビッグエンディアンで並べるが、リトルエンディアンで並べる場合は、「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)」に載っている。