※この記事はz/OS専用です
漢字など日本語文字を含む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へデータを転送する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//********************************************************************* //* 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 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は←で表示されます
(→と←が正しく表示できるかはPC側のソフトウェア次第)。EBCDICの場合、元のSO(x0E)とSI(x0F)が変換されずにそのまま残ります。SOとSIで囲まれた漢字部分はシフトJISに変換されます。SPACEの場合、SO(x0E)とSI(x0F)は空白文字(x20)に置き換えらます。これらのオプションによって、SO/SIコードの部分がバイト・データとして残るため、表示上の桁ずれが起きなくなります。PC上でも桁位置を合わせて内容を確認したい場合に便利です。
1 2 3 |
LOCSITE TRAIL SJISKANJI (NOTYPE SOSI ASCII PUT 'PRJ1.JCL(DBCSDATA)' ZOS.DBCSDATA-5.txt |
転送前に、LOCSITEコマンドでTRAILを指示しておくと、固定長レコードの後方ブランク文字を削除せずにそのまま転送します。コード変換はしても、レコードの長さは変えたくない、といった場合に利用できます。(※テキスト・データなので各レコードの末尾に改行コード(x0D0A)だけは付加される)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//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」に置き換えて使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//********************************************************************* //* 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など多くのプラットフォームで共通に利用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//********************************************************************* //* 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」と指定します。
UNICODE(UTF-8)に変換してz/OSからPCへデータを転送する
UTF-8で符号化されたunicode文字に変換することもできます。SBCS文字がASCIIコードと同じ1バイトで格納されるので、SBCS文字が多いデータはUCS-2形式に比べファイルサイズを小さくできますが、DBCS文字(漢字、かな文字)は3バイトで格納されるため、DBCS文字ばかりのデータでは反対にUCS-2形式よりもファイルサイズが大きくなります。UTF-8で符号化されたunicodeデータは、ASCIIコードとの親和性も高い上に他言語対応も容易なため、Linuxを始めとするオープン系システムでは事実上の標準文字コードになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//********************************************************************* //* Sample JCL for FTP File Transmission //* ==================================== //* TRANSLATE IBM-KANJI TO UNICODE(UTF8) //********************************************************************* //FTP EXEC PGM=FTP,PARM='(EXIT' //SYSPRINT DD SYSOUT=* //SYSIN DD * 000.000.000.000 FTPUSER FTPUSER LOCSITE FWF LOCSITE EN=MBCS MBD=(IBM-939,UTF-8) PUT 'PRJ1.DATA01' ZOS.DBCSDATA-1.txt QUIT //*-------------------------------------------------------------------* //FTP EXEC PGM=FTP,PARM='(EXIT' //SYSPRINT DD SYSOUT=* //SYSIN DD * 000.000.000.000 FTPUSER FTPUSER LOCSITE FWF LOCSITE EN=MBCS MBD=(IBM-939,UTF-8) GET ZOS.DBCSDATA-9.txt 'PRJ1.DATA02' (REPLACE QUIT // |
UTF-8へ(から)変換する場合、z/OS側のデータセットは可変長(または不定長)形式でなければなりません。固定長形式のデータセットはICEGENERで可変長データセットにコピーし、可変長形式のデータセットはDFSORTで固定長データセットにコピーすることで、レコード形式を変換することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//* //* DATASET COPY VB --> FB //* //COPY@V2F EXEC PGM=SORT //SYSOUT DD SYSOUT=* //SORTIN DD DISP=SHR,DSN=ZOS.DBCSDATA.VB //SORTOUT DD DISP=(,CATLG),DSN=ZOS.DBCSDATA.FB, // UNIT=SYSDA,SPACE=(TRK,(10,10),RLSE), // DCB=(RECFM=FB,LRECL=80) //SYSIN DD * OPTION COPY OUTFIL VTOF,OUTREC=(5,80),VLFILL=C' ' //* //* DATASET COPY FB --> VB //* //COPY@F2V EXEC PGM=ICEGENER //SYSPRINT DD SYSOUT=* //SYSUT1 DD DISP=SHR,DSN=ZOS.DBCSDATA.FB //SYSUT2 DD DISP=(,CATLG),DSN=ZOS.DBCSDATA.VB, // UNIT=SYSDA,SPACE=(TRK,(10,10),RLSE), // DCB=(RECFM=VB,LRECL=84) //SYSIN DD DUMMY // |
FTPクライアントの詳細は、マニュアル「z/OS Communications Server IP ユーザーズ・ガイドとコマンド(SC88-5359)」およびRedbook「IBM z/OS V2R2 Communications Server TCP/IP Implementation: Volume 2 Standard Applications(SG24-8361)」に載っています。