データ変換

ランタイム環境が異なるとデータを解釈する方法にも差が生じるので、ある環境から別の環境に渡すデータは、プログラム上での変換が必要な場合があります。 Java™ 環境から COBOL 環境に移動したデータ、および COBOL から Java に移動したデータは、必ずデータ変換を行う必要があります。データ変換が実行されるタイミングは、COBOL の準備時と、COBOL や Java の実行時です。

アラビア語またはヘブライ語などの双方向言語をサポートするプログラムでは、BIDI 変換テーブルを使用して、コード・ページ変換と併せてテキスト・データの再配列を指定できます。BIDI 変換テーブルの作成については、トピック『双方向言語テキスト』を参照してください。

ワークステーション・ベースのファイルをビルド・サーバーに 転送する場合、COBOL の準備プロセスにより、ファイル・コンテンツ、ファイル・パス情報、および環境変数値が変換されます。この場合のデータ変換テーブルの設定に必要なステップについては、このトピックの中で後述します。

実行時の状態が次のような場合にも、プログラムで変換テーブルが使用されます。
次のような状態のとき、実行時変換を使用することができます。
これ以降は、次に示す項目の詳細を説明します。

z/OS COBOL 環境での変換テーブルのカスタマイズについては、「IBM Rational® COBOL Runtime Guide for zSeries」を参照してください。

COBOL プログラムの生成時のデータ変換

COBOL プログラムをワークステーション上で生成し、z/OS または iSeries® ビルド・サーバー上で準備すると、 変換は clientCodeSet および serverCodeSet ビルド記述子オプションの指定に従ってビルド・サーバー上で処理されます。 ビルド記述子オプションでは、z/OS および iSeries 上の ICONV 変換サービスに対して定義されるコード・セットを指定する必要があり、指定しないと、デフォルトの設定が適用されます。

アラビア語やヘブライ語などの双方向言語をサポートするプログラムでは、コード・ページ変換のほか、テキスト・リテラルの再配列も必要になる場合があります。 詳しくは、トピック『双方向言語テキスト』を参照してください。

生成済み COBOL プログラムでの実行時のデータ変換

生成した COBOL プログラムが、ASCII 文字セットをサポートするリモート CICS 領域上のプログラムまたはファイルにアクセスすると、変換テーブルに従って、呼び出し側で変換が実行されます。この場合の変換テーブルは、コード・ページ変換の情報が格納されているロード・モジュールです。

次の表には、EGL と一緒に収録されている変換テーブルを示します。この変換テーブルには、生成された COBOL プログラムが実行時にアクセスできます。これらの変換テーブルは、EBCDIC 形式と Windows 2000/NT/XP ASCII コード・ページの間でデータを変換します。

言語 テーブル名
ブラジル・ポルトガル語 ELACNPTB
中国語 (簡体字) ELACNCHS
中国語 (繁体字) ELACNCHT
英語、大文字 ELACNENP
英語 (米国) ELACNENU
フランス語 ELACNFRA
ドイツ語 ELACNDEU
イタリア語 ELACNITA
日本語、カタカナ (1 バイト文字セット) ELACNJPN
韓国語 ELACNKOR
スペイン語 ELACNESP
スイス・ドイツ語 ELACNDES

生成済み Java プログラムでの実行時のデータ変換

以下の規則は Java コードに適用されます。
  • 生成された Java プログラム またはラッパーが、生成された Java プログラムを呼び出すと、実行時に開始される 1 組の EGL クラスに従って、呼び出し側プログラムで変換が実行されます。ほとんどの場合、変換を行う必要はまったくありません。呼び出し側が、起動側が使用しているのとは異なるコード・ページを使用するリモート・プラットフォームにアクセスする場合でもやはり必要ありません。ただし、次の場合には変換テーブルを指定しなければなりません。
    • 呼び出し側プログラムが Java コードであり、1 つのコード・ページをサポートするシステム上で稼働している。
    • 呼び出し先プログラムが非 Java プログラムであり、別のコード・ページをサポートするシステム上で稼働している。

    この場合のテーブル名は、実行時に必要な種類の変換を表すシンボルになります。

  • 生成された Java プログラムがリモートの WebSphere® MQ メッセージ・キューにアクセスすると、実行時に開始される一連の EGL クラスに従って、呼び出し元で変換が実行されます。 起動側が使用しているのとは異なるコード・ページを使用するリモート・プラットフォームに呼び出し側がアクセスする場合は、『関連要素』に示す、WebSphere MQ メッセージ・キューを参照する変換テーブルを指定します。
次の表は、生成された Java コードが実行時にアクセスできる変換テーブルをリストしたものです。 それぞれの名前のフォーマットは、CSOcx です。 可変部については、次のとおりです。
c
この可変部は、呼び出し先プログラムのプラットフォームでサポートされている文字セットを表します。 次のいずれかを選択します。
  • Java の場合は J (呼び出し先プログラムが EGL 生成の Java プログラムの場合)
  • EBCDIC の場合は E (呼び出し先プログラムが EGL 生成の COBOL プログラムの場合)
x
この可変部は、リモート・プログラムのプラットフォームに指定されている言語のコード・ページ番号を表します。 各番号は、「Character Data Representation Architecture Reference and Registry、SC09-2190」に指定されています。各変換テーブルによってサポートされているコード化文字セットは、レジストリーによって識別できます。

  リモート・プラットフォーム
言語 Linux UNIX Windows 2000/NT/XP z/OS UNIX システム・サービスまたは iSeries Java z/OS または iSeries COBOL
アラビア語 CSOJ1046 CSOJ1046 CSOJ1256 CSOJ420 CSOE420
中国語 (簡体字) CSOJ1381 CSOJ1381 CSOJ1386 CSOJ1388 CSOE1388
中国語 (繁体字) CSOJ950 CSOJ950 CSOJ950 CSOJ1371 CSOE1371
キリル文字言語 CSOJ866 CSOJ866 CSOJ1251 CSOJ1025 CSOE1025
デンマーク語 CSOJ850 CSOJ850 CSOJ850 CSOJ277 CSOE277
東ヨーロッパ言語 CSOJ852 CSOJ852 CSOJ1250 CSOJ870 CSOE870
英語 (英国) CSOJ850 CSOJ850 CSOJ1252 CSOJ285 CSOE285
英語 (米国) CSOJ850 CSOJ850 CSOJ1252 CSOJ037 CSOE037
フランス語 CSOJ850 CSOJ850 CSOJ1252 CSOJ297 CSOE297
ドイツ語 CSOJ850 CSOJ850 CSOJ1252 CSOJ273 CSOE273
ヘブライ語 CSOJ856 CSOJ856 CSOJ1255 CSOJ424 CSOE424
日本語 CSOJ943 CSOJ943 CSOJ943 CSOJ1390 (カタカナ SBCS)、CSOJ1399 (ラテン語 SBCS) CSOE1390 (カタカナ SBCS)、CSOE1399 (ラテン語 SBCS)
韓国語 CSOJ1363 CSOJ1363 CSOJ1363 CSOJ1364 CSOE1364
ポルトガル語 CSOJ850 CSOJ850 CSOJ1252 CSOJ037 CSOE037
スペイン語 CSOJ850 CSOJ850 CSOJ1252 CSOJ284 CSOE284
スウェーデン語 CSOJ850 CSOJ850 CSOJ1252 CSOJ278 CSOE278
スイス・ドイツ語 CSOJ850 CSOJ850 CSOJ1252 CSOJ500 CSOE500
トルコ語 CSOJ920 CSOJ920 CSOJ1254 CSOJ1026 CSOE1026

Java からプログラムを呼び出す際、 リンケージ・オプション・パーツに変換テーブルの値が指定されていない場合のデフォルトの変換テーブルは、英語 (US) の変換テーブルになります。

変換アルゴリズム

レコードと構造体のデータ変換は、副構造のない構造体フィールドの宣言が基本になります。

名前のない (構造化レコード内でアスタリスクによって示される) 変数や、BIN、BIGINT、BOOLEAN、INT、SMALLINT、DECIMAL、MONEY、PACF、 HEX、STRING、または UNICODE 型の変数の変換は実行されません。 ただし、双方向変換テーブルを使用している場合は、UNICODE および STRING 変数が、表に定義されているとおり反転されます。 詳しくは、双方向データの処理を参照してください。

CHAR、DBCHAR、または MBCHAR 型のデータは、COBOL または Java の変換テーブルに従って変換されます。

FLOAT および SMALLFLOAT 型の変数の場合、変換ルーチンは、Java には IEEE 754 フォーマット、zSeries COBOL には IBM® 370 フォーマットを使用して、Java から zSeries COBOL への変換、およびその逆の変換を行います。 Java と iSeries COBOL 間の場合、FLOAT および SMALLFLOAT 変数の変換は必要ありません。

MBCHAR データの EBCDIC から ASCII への変換では、変換ルーチンによってシフトイン・シフトアウト (SO/SI) 文字が削除され、この文字数と同じ数のブランクが変数の末尾に追加されます。ASCII から EBCDIC への変換では、変換ルーチンによって 2 バイトのストリングの前後に SO/SI 文字が挿入され、フィールドに収容できる有効な最後の文字で値が切り捨てられます。 MBCHAR フィールドが可変長レコード内にあり、現行レコードの末尾が MBCHAR フィールド内にある場合、レコード長は SO/SI 文字の挿入または削除を反映するように調整されます。レコード長は、現行レコードの末尾がどこにあるかを示しています。

型が NUM または NUMC の変数では、変換ルーチンが CHAR アルゴリズムを使用して、最後のバイトを除くすべてのバイトを変換します。符号ハーフバイト (フィールドの最後のバイトのうちの最初のハーフバイト) は、次の表に示す 16 進値に従って変換されます。
表 1. NUM および NUMC 変数の変換
NUM 型の EBCDIC NUMC 型の EBCDIC ASCII
F (正符号) C 3
D (負符号) D 7

DATE、INTERVAL、TIME、または TIMESTAMP 型の変数の場合、EGL は、CHAR アルゴリズムおよびストリング形式のその変数を使用して値を変換します。

sysLib.convert() システム関数および sysVar.callConversionTable システム変数の詳細は、 「EGL 言語解説書」のトピック『convert()』および『callConversionTable』に記載されています。


フィードバック