EBCDIC 文字セットの使用

Open PL/I コンパイラおよびランタイムは、EBCDIC フォーマットでエンコードされた文字セットおよび ASCII フォーマットでエンコードされた文字セットをサポートします。EBCDIC の場合、これは実質的に、ユーザ・プログラムがすべての文字データを EBCDIC として認識することを意味します。文字データが入力デバイスから読み込まれ、表示デバイスに書き込まれた場合、すべての文字データは人間が読めるテキストとして表示されます。EBCDIC データがファイルに書きこまれるとき、またはファイルから読み込まれるときは、データは必ず EBCDIC としてエンコードされます。

EBCDIC モードでプログラムをコンパイルするということは、ソース・ファイルが EBCDIC フォーマットであるこという意味ではありません。ソース・ファイルは常に ASCII フォーマットであり、'abc' などの文字ストリング・リテラルは、コンパイラにより EBCDIC に変換されます。同様に、EBCDIC モードのランタイム・サポートは、すべての文字データを EBCDIC フォーマットで保持し、人間が読める入力または出力デバイスで使用する場合のみ、その文字データを EBCDIC から ASCII に変換したり、ASCII から EBCDIC に変換したりします。

どのようなプログラムでも、ASCII モードまたは EBCDIC モードのいずれかで、すべてのモジュールがコンパイルされることになります。

次のコンパイラ・スイッチがサポートされています。

-ascii ユーザ・プログラムで使用されているすべての文字データが、ASCII フォーマットで保存されます (デフォルト)。
-ebcdic ユーザ・プログラムで使用されているすべての文字データが、EBCDIC フォーマットで保存されます。

次に、コンパイラによる EBCDIC モードでの文字データの処理方法の例を示します。

'abc' 0x818283 として保存されます。
'abc ' 0x81828340 として保存されます。
'abc 'E 0x81828340 として保存されます。
'abc 'A '0x61626320 として保存されます。
dcl s char (4) init (''); 0x40404040 として保存されます。
dcl s char (4) init (''E); 0x40404040 として保存されます (''E は 4 つの EBCDIC スペース 0x040 で埋められた NULL ストリング)
dcl s char (4) init (''A); 0x40404040 として保存されます (''A は 4 つの EBCDIC スペース 0x040 で埋められた NULL ストリング)

次に、コンパイラによる ASCII モードでの文字データの処理方法の例を示します。

'abc' 0x616263 として保存されます。
'abc ' 0x61626320 として保存されます。
'abc 'E 0x81828340 として保存されます。
'abc 'A '0x61626320 として保存されます。
dcl s char (4) init (''); 0x20202020 として保存されます。
dcl s char (4) init (''E); 0x20202020 として保存されます (''E は 4 つの EBCDIC スペース 0x020 で埋められた NULL ストリング)
dcl s char (4) init (''A); 0x20202020 として保存されます (''A は 4 つの EBCDIC スペース 0x020 で埋められた NULL ストリング)
注:上記の例では、NULL ストリングは EBCDIC モードまたは ASCII モードに応じてスペースで埋められるため、"E および "A の接尾辞文字は不要です。

サーバを経由して EBCDIC モードまたは ASCII モードでコンパイルする場合、出力は、サーバの MF_CHARSET の設定に左右されます。次の表に、サーバの MF_CHARSET 設定に基づいて、EBCDIC または ASCII でコンパイルされたプログラムを出力する場合に予期される、SYSPRINT の出力フォーマットを示します。

プログラムのコンパイル・モード サーバの実行モード DCB 予期される SYSPRINT のフォーマット
ASCII ASCII SYSOUT=* ASCII
EBCDIC EBCDIC SYSOUT=* EBCDIC
ASCII ASCII SYSOUT=*,DCB=(RECFM=LSEQ) ASCII
EBCDIC EBCDIC SYSOUT=*,DCB=(RECFM=LSEQ) ASCII
ASCII EBCDIC SYSOUT=*,DCB=(RECFM=LSEQ) ASCII

EBCDIC データ・セットは EBCDIC 形式であり、ESMAC で正しく表示されることに注意してください。LSEQ データ・セットは ASCII 形式に反転されて、ESMAC で正しく表示されます。