Server Express 技術情報(FAQ)


UNIX マシン上で EBCDICデータを操作する方法を教えてください

Server Express製品は ASCIIコード系を前提として設計されており、日本語は EUC または ShiftJIS が使用可能です。すなわち、ソースファイルは、ASCII、EUC、ShiftJISコード系で書かれている必要がありますし、画面入出力やプリンタへの印刷もそれらのコード系を仮定しています。
一方、汎用機とのデータ連携においては、データをEBCDICコード系で受け取ることがあります。ここでは、Server Expressを使用して汎用機から受け渡された EBCDICデータファイルを処理する方法について説明します。
Server Expressは以下の2つの方法を提供しています:

  • CHARSET(EBCDIC)コンパイル指令による、プログラム定数のEBCDIC化
  • CODE-SET句による、外部EBCDICファイルの入出力


CHARSET(EBCDIC)コンパイル指令


この指令でコンパイルされたCOBOLプログラム中に記述された文字定数・数字定数は、すべてEBCDICコードでアロケートされます。例えば、

      01  ITEM-1   PIC X(5)    VALUE "ABCDE".

と書くと、ITEM-1 は 16進で X'C1C2C3C4C5' とアロケートされます。また、

      01  ITEM-1   PIC 9(5)    VALUE 123.

と書くと、ITEM-1 は 16進で X'F0F0F1F2F3' とアロケートされます。

この指令でコンパイルされたCOBOLプログラムでは、ACCEPT、DISPLAY文による画面入出力と、ASSIGN TO PRINTERと指定されたファイルへの出力では、ASCII・EBCDIC変換が行われます。従って、16進で X'C1C2C3C4C5' とアロケートされていても、これを DISPLAYすれば通常に "ABCDE" と表示されます。しかし、PRINTER以外のデータファイルへの入出力では変換はなされませんので、EBCDICのデータファイルを作成することができます。以下に、その実行例を示します:

1) 例として、以下のようなCOBOLプログラムを用意します。

$ cat write.cbl
      ENVIRONMENT DIVISION.
      INPUT-OUTPUT SECTION.
      FILE-CONTROL.
          SELECT OUTFILE ASSIGN TO "DATAFILE.dat".
      DATA DIVISION.
      FILE SECTION.
      FD  OUTFILE.
      01  OUTREC   PIC X(16).
      PROCEDURE DIVISION.
      1.  OPEN OUTPUT OUTFILE.
          MOVE ALL "A" TO OUTREC.
          WRITE OUTREC.
          MOVE ALL "1" TO OUTREC.
          WRITE OUTREC.
          CLOSE OUTFILE.
          STOP RUN.
$


2) 1レコード 16バイトの固定長順ファイルに "A" と "1" の 2件のレコードを書き出しています。

3) これを、まず通常にコンパイル・実行してみます。

$ cob write.cbl
$ cobrun write.int
$


4) 作製された出力ファイルのダンプを見てみますます。

$ od -x DATAFILE.dat
0000000 4141 4141 4141 4141 4141 4141 4141 4141
0000020 3131 3131 3131 3131 3131 3131 3131 3131
0000040
$

このように ASCIIコードで書き出されています。
5) 次にこの同じプログラムを、CHASET(EBCDIC)指令でコンパイル・実行してみます。

$ cob write.cbl -C "CHARSET(EBCDIC)"
$ cobrun write.int
$


6) 作製された出力ファイルのダンプを見てみますます。

$ od -x DATAFILE.dat
0000000 c1c1 c1c1 c1c1 c1c1 c1c1 c1c1 c1c1 c1c1
0000020 f1f1 f1f1 f1f1 f1f1 f1f1 f1f1 f1f1 f1f1
0000040
$

このように EBCDICコードで書き出されています。


ファイル記述中のCODE-SET句

FDのファイル記述中に CODE-SET句を指定することによって、外部ファイルが EBCDICコード系であることをプログラムに指示することができます。 この指定を与えられたファイルに対して、入出力時に自動的に ASCII・EBCDIC変換が実行されます。以下に、その実行例を示します:

1) 例として、先ほどの例題で作製された EBCDICデータファイルを使用します。

$ od -x DATAFILE.dat
0000000 c1c1 c1c1 c1c1 c1c1 c1c1 c1c1 c1c1 c1c1
0000020 f1f1 f1f1 f1f1 f1f1 f1f1 f1f1 f1f1 f1f1
0000040
$


2) これを READする以下のようなプログラムを考えます:

$ cat read.cbl
      ENVIRONMENT DIVISION.
      INPUT-OUTPUT SECTION.
      FILE-CONTROL.
          SELECT INFILE ASSIGN TO "DATAFILE.dat".
      DATA DIVISION.
      FILE SECTION.
      FD  INFILE.
      01  INREC   PIC X(16).
      PROCEDURE DIVISION.
      1.  OPEN INPUT INFILE.
          PERFORM UNTIL EXIT
            READ INFILE AT END EXIT PERFORM END-READ
            DISPLAY INREC
          END-PERFORM.
          CLOSE INFILE.
          STOP RUN.
$


3) このプログラムを通常にコンパイル・実行してみます。 $ cob read.cbl

$ cobrun read.int
疏疏疏疏疏疏疏疏
髑髑髑髑髑髑髑髑
$

このように、EBCDICデータをREADしてDISPLAYしていますので文字化けします。

4) 次に、このプログラムのファイル記述に CODE-SET句を以下のように追加します:

$ cat read.cbl
      ENVIRONMENT DIVISION.
      CONFIGURATION SECTION.
      SPECIAL-NAMES.
          ALPHABET CHAR-EBCDIC IS EBCDIC.
      INPUT-OUTPUT SECTION.
      FILE-CONTROL.
          SELECT INFILE ASSIGN TO "DATAFILE.dat".
      DATA DIVISION.
      FILE SECTION.
      FD  INFILE
          CODE-SET IS CHAR-EBCDIC.
      01  INREC   PIC X(16).
      PROCEDURE DIVISION.
      1.  OPEN INPUT INFILE.
          PERFORM UNTIL EXIT
            READ INFILE AT END EXIT PERFORM END-READ
            DISPLAY INREC
          END-PERFORM.
          CLOSE INFILE.
$


5) このプログラムを通常にコンパイル・実行してみます。

$ cob read.cbl
$ cobrun read.int
AAAAAAAAAAAAAAAA
1111111111111111
$

このように、EBCDICデータのREAD時にASCIIへ変換されますので、文字化けしません。