文字コード変換テーブルの参照
今ではTCP/IP(FTP等)によるメインフレームとWindowsやUnix間でのファイル転送は一般的に行われています。漢字などの日本語データは文字コードの違いから意図しない文字に変換されたり、独自の変換を行いたい場合があります。TCP/IPの通信システムが使用する漢字コードの変換テーブルは公開されていて、カスタマイズも可能です。
DBCS変換テーブルの参照
MVS:z/OS Communications Serverの場合
z/OSではDBCS(漢字などの2バイト文字コード)の変換テーブルはバイナリー、テキスト両方の形式で提供されています。FTPなどのプログラム製品が実際のファイル転送時に使うのはバイナリー形式のテーブルです。しかしどの文字がどのように変換されるか、対応する文字コードを変更する、などと言った場合はテキスト形式のテーブルを参照します。
テキスト形式のテーブルは区分データセットで提供されていて、種類毎にメンバーに分かれています。データセットの標準名は「TCPIP.SEZADBCX」で、メンバー「EZAKJLAT」がPCなどの漢字コードとの相互変換テーブル、メンバー「EZAKJ941」が同じコードテーブル941の1995レベル対応版です。
; ; EZAKJLAT TCPXLATE - Editable Japanese translate tables. ; ; ETA = Ebcdic to Ascii Conversion (Host Code Page ID 300 to PC) ; ATE = Ascii to Ebcdic Conversion (PC to Host Code Page ID 300) ; ; Use CONVXLAT to generate STANDARD TCPKJBIN (or TNDBCSTM codefiles) ; from this source file. ; ;DBCS Area - SJISETA,SJISATE not used for TNDBCSTM codefile generation. ; - JDECETA,JDECATE not used for STANDARD TCPKJBIN generation. ; ;SJISETA SJISATE JIS78ETA JIS78ATE JIS83ETA JIS83ATE … ; … ;sub: FCFC sub: FEFE sub: 747E sub: FEFE sub: 747E sub: FEFE … ; … 4040 8140 8140 4040 4040 2121 2121 4040 4040 2121 2121 4040 … 4041 FCFC 8141 4344 4041 747E 2122 4344 4041 747E 2122 4344 … 4042 FCFC 8142 4341 4042 747E 2123 4341 4042 747E 2123 4341 … 4043 FCFC 8143 426B 4043 747E 2124 426B 4043 747E 2124 426B … 4044 FCFC 8144 424B 4044 747E 2125 424B 4044 747E 2125 424B … 4045 FCFC 8145 4345 4045 747E 2126 4345 4045 747E 2126 4345 … 4046 FCFC 8146 427A 4046 747E 2127 427A 4046 747E 2127 427A … 4047 FCFC 8147 425E 4047 747E 2128 425E 4047 747E 2128 425E … : : : : FEFD FCFC FEFD 747E FEFD 747E … FEFE FCFC FEFE 747E FEFE 747E …
テーブルの内容はこんな感じです。ホスト側とPC側の各コードと対応する相手側コードの羅列です。変換コードをカスタマイズする場合は、対応する相手側コードの値を書き換えます。テーブルは左からShiftJIS(ホストからPC)、ShiftJIS(PCからホスト)、JIS78(ホストからPC)、JIS78(PCからホスト)、JIS83、EUC...と横に並んでおり(サンプルでは右側を端折っています)、それぞれコード番号の低い順に縦に並んでいます。テーブルの詳細はマニュアル「z/OS Communications Server:IP 構成解説書」の付録A. 変換テーブルの使用に記載されています。
MSP:TISPの場合
MSPのTISPではユーティリティーによって変換テーブルを出力することができますが、ロードモジュール形式のバイナリーデータなので参照には向きません。
//STEP1 EXEC PGM=KGTLJCNV,REGION=4096K //CVTBL DD DISP=(,KEEP),DSN=WORK.KGTLJCNV, // UNIT=SYSDA,VOL=SER=WORK01,SPACE=(TRK,(45,15,2)), // DCB=(RECFM=U,BLKSIZE=4096) //SYSPRINT DD SYSOUT=* //SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA,SPACE=(TRK,(60,5)) //SYSUT2 DD DSN=&&SYSUT2,UNIT=SYSDA,SPACE=(TRK,(10,5)) //SYSUT3 DD DSN=&&SYSUT3,UNIT=SYSDA,SPACE=(TRK,(10,5)) //SYSUT4 DD DSN=&&SYSUT4,UNIT=SYSDA,SPACE=(TRK,(30,5)) //SYSUT5 DD DSN=&&SYSUT5,UNIT=SYSDA,SPACE=(TRK,(20,5)) //SYSUT6 DD DSN=&&SYSUT6,UNIT=SYSDA,SPACE=(TRK,(10,5)) //SYSUT7 DD DSN=&&SYSUT7,UNIT=SYSDA,SPACE=(TRK,(10,5)) //SYSUT8 DD SYSOUT=* //SYSUT9 DD SYSOUT=* //SYSIN DD * TYPE SJIS TNAM DS2J,DJ2S EPAD FFFF,FFFF /* //
このJCLによってJEFコードとShiftJISコードの文字コード変換テーブルを生成できます。CVTBL DD文で指定した区分データセットに、ShiftJISからJEF方向への変換テーブルがKGT@DS2J、反対方向の変換テーブルがKGT@DJ2Sのメンバー名で生成されます。
バイナリーデータですがテーブル形式は単純で、JEFからShiftJISコードへの変換テーブルの場合、先頭からオフセット0の2バイトがJEFコードx0000に対するShiftJISコードの値、オフセットx8080の2バイトがJEFコードx4040に対するShiftJISコードの値、オフセットx1FFFEの2バイトがJEFコードxFFFFに対するShiftJISコードの値、というように順番に並んでいる128KB(2バイト×65536文字分)のテーブルです。なのでSPZAPユーティリティーなどでダンプすればテーブル内容の参照は可能です。テーブルの詳細はマニュアル「TISP/BP 導入手引書」の第5章 コード変換テーブル生成ユーティリティに記載されています。
DBCS変換テーブルの変更
MVS:z/OS Communications Serverの場合
テキスト形式で提供されている変換テーブルを書き換えた後、CONVXLATユーティリティーでバイナリー形式に変換します。
//CONVXLAT EXEC PGM=CONVXLAT, // PARM='''WORK.SEZADBCX(EZAKJLAT)'' ''TCPIP.FTP.TCPKJBIN'' (KANJI' //SYSPRINT DD SYSOUT=* //SYSIN DD DUMMY //
最初のパラメーターは入力元のテキスト形式変換テーブル、2番目のパラメーターが出力先データセットの指定です。IBM提供のオリジナルテーブルを直接変換することは避けて、任意のデータセットにコピーを作成する方がいいでしょう。出力先データセットもIBMデフォルトのデータセットを上書きするのではなく、マニュアルで解説されているカスタマイズ用データセットを利用する方がいいでしょう。カスタマイズの詳細はマニュアル「z/OS Communications Server:IP 構成解説書」の付録A. 変換テーブルの使用:DBCS 変換テーブルのカスタマイズに記載されています。
MSP:TISPの場合
MSPのTISPではKGTLJCNVユーティリティーによって変換テーブルをカスタマイズすることができます。
//STEP1 EXEC PGM=KGTLJCNV,REGION=4096K //CVTBL DD DISP=SHR,DSN=USR1.LINKLIB //SYSPRINT DD SYSOUT=* //SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA,SPACE=(TRK,(60,5)) //SYSUT2 DD DSN=&&SYSUT2,UNIT=SYSDA,SPACE=(TRK,(10,5)) //SYSUT3 DD DSN=&&SYSUT3,UNIT=SYSDA,SPACE=(TRK,(10,5)) //SYSUT4 DD DSN=&&SYSUT4,UNIT=SYSDA,SPACE=(TRK,(30,5)) //SYSUT5 DD DSN=&&SYSUT5,UNIT=SYSDA,SPACE=(TRK,(20,5)) //SYSUT6 DD DSN=&&SYSUT6,UNIT=SYSDA,SPACE=(TRK,(10,5)) //SYSUT7 DD DSN=&&SYSUT7,UNIT=SYSDA,SPACE=(TRK,(10,5)) //SYSUT8 DD SYSOUT=* //SYSUT9 DD SYSOUT=* //SYSIN DD * TYPE SJIS * MAKE SJIS <-> JEF TRANSLATION TABLE TNAM NSJJ,NJSJ * TABLE NAME EPAD FFFF,FFFF * PAD CODE FOR UNDEFINE CHARACTER BDEF 7846,F3A2 * OUR OWN CODE DEFINITION BDEF 79BC,EE68 * OUR OWN CODE DEFINITION /* //
このJCLによってJEFコードとShiftJISコードの文字コード変換テーブルを生成できます。CVTBL DD文で指定した区分データセットに、ShiftJISからJEF方向への変換テーブルがKGT@DS2J、反対方向の変換テーブルがKGT@DJ2Sのメンバー名で生成されます。
JEFコード7846はSJISコードF3A2に、79BCはEE68に、それぞれ独自のコード変換を割り当てています。ユーティリティーの詳細はマニュアル「TISP/BP 導入手引書」の第5章 コード変換テーブル生成ユーティリティに記載されています。実際の使用にあたっては、TISP-BP導入手引書や開発手引書(動的コード変換ルーチン)も併せて参照して下さい。