前ページへ

移植可能なプログラムの作成

NLS の実装例次ページへ

第 8 章 各国語対応

この章では、Server Express の各国語対応について説明します。

8.1 概要

Server Express は、次の各水準で各国語に対応しています。

8.2 NLS(各国語サポート)

NLS は、プログラムで使用する文字集合を固定することなく、世界各国で使用されている多彩なシングルバイト文字集合、文字の照合順序、および通貨編集記号に柔軟に対応するための機能です。この機能は、英語圏における文字集合の処理や大小文字の照合、および適切な通貨記号の選択にも役立ちます。

NLS で対応できる言語と文字集合の一部を次に示します。

ISO646 および派生規格 フランス語、独語、スエーデン語、デンマーク語、イタリア語、スペイン語、ポルトガル語
ISO8859/1 西ヨーロッパの各言語
IBM PC 8 ビット文字集合 西ヨーロッパの各言語

NLS 指令を使用してコンパイルしたプログラムは、言語環境変数で指定された言語、国、および文字集合に従って動作します。

8.3 DBCS(2 バイト文字セット)サポート

DBCS サポートを利用すると、日本、中国、韓国など、2 バイト文字を使用する諸国向けのアプリケーションを開発できます。

Server Express の日本語版は DBCS を完全にサポートしています(英語版は部分的にサポート)。

DBCS 対応アプリケーションは ACCEPT/DISPLAY と PIC X など、既存のツールと構文で開発することも可能ですが、Server Express では DBCS 環境で使用されるその他の COBOL 構文も使用できます。これらの構文については、『言語リファレンス - 追加トピック』で説明されています。DBCS サポートを有効化するには、DBCS、NCHAR、JAPANESE のいずれかのコンパイラ指令を使用します。

CBL_GET_OS_INFO ライブラリルーチンを使用すると、アプリケーションで極東諸国の文字集合を識別することができます。詳細については、『ライブラリルーチン』を参照してください。

8.3.1 DBCS 透過性

DBCS 透過性は、さまざまなプラットフォーム版の Object COBOL でサポートされています。詳細については、DBCS サポートに関するオンラインマニュアルを参照してください。

DBCS 透過性のサポートにより、アプリケーションのユーザは、1 バイト文字と 2 バイト文字が混在した母国語を入力、格納、操作、表示、および印刷できます。さらに、Animator、Editor、Screens などのツールを使用して、母国語対応アプリケーションプログラムの作成や保守を行うことも可能です。

バックスペース、削除、挿入、カーソル移動などの編集操作は、すべてバイト単位です。たとえば、2 バイト文字を 1 文字削除する場合には、Delete キーを続けて 2 回押し、文字を構成する 2 つのバイトを削除します。一方のバイトを削除した時点で残りのバイトの表示が乱れる場合がありますが、このバイトは Delete キーをもう一度押せば削除され、表示も正常に戻ります。

なお、使用するツールや端末環境によっては、2 バイト文字の編集やカーソル移動が、バイト単位ではなく文字単位で実行される場合もあります。

次の 2 つのツールでは、DBCS の透過性のサポートは限定されています。これらのツールについては、『Utilities Handbookを参照してください。

8.3.2 描線および描画用の 2 バイト文字

CBL_GET_SCR_LINE_DRAW ルーチンと CBL_GET_SCR_GRAPHICS ルーチンは、Object COBOL がサポートするあらゆる環境で描線と描画に使用される文字をサポートしています。『Programmer's Guide to Creating User Interfaces』の『Generic Line Drawing』の章を参照してください。

Server Express に付属している一部のサンプルプログラムには、IBM PC 形式の線描画文字が使用されています。この文字はすべての環境でサポートされているわけではありません。使用環境によっては、これらのサンプルプログラムを実行する前に、COBOL ソース内の該当文字を変更する必要があります。

8.3.2.1 DBCS サポート用の構文拡張

Object COBOL での DBCS アプリケーション開発には、標準の PIC X のほか、次の項目が使用できます。


注: DBCS クラスの識別子に形式 4 または形式 5 の ACCEPT 文を実行する場合は、入力するデータを 2 バイト文字のみに限定する必要があります。『言語リファレンス - 追加トピック』の『2 バイト文字支援機能』を参照してください。


8.3.3 ASCII と EBCDIC の相互変換

Object COBOL では、CHARSET コンパイラ指令と _CODESET プログラムを使用して ASCII と EBCDIC の相互変換を行うことができます。いくつかの _CODESET プログラムは、一部の極東言語と独語の ASCII および EBCDIC コードページ (文字集合) を処理するように定義されています。

8.4 各国語対応の条件

NLS または DBCS の透過性をサポートするには、次の条件を満たす必要があります。

Server Express が提供する、指定された言語、国、および文字コード用の言語テーブルは、UNIX に依存します。この言語テーブルはロケールと呼ばれます。

8.5 NLS および DBCS 用の環境設定

NLS または DBCS をサポートするプログラムを UNIX 上で実行する前に、言語環境変数でロケールを設定する必要があります。ロケールは、言語、地域、および文字集合から構成されます。

ロケールはすでに設定されている可能性もあります。未設定の場合には、次の構文で設定します。

LANG=language[_territory[.codepage]] 
export LANG

各パラメータの内容は、次のとおりです。

language プログラムで使用する言語。このパラメータでメッセージカタログが指定されるため、エラーメッセージの出力言語も統一されます。

language には、使用する言語を表す略語を指定します (この略語は、ISO 639 などの規格で標準化されています)。指定できる略語については、UNIX のマニュアルを参照してください。次にいくつかの例を示します。

en = 英語
fr = フランス語
ko = 韓国語
zh = 中国語
jp = 日本語
_ (下線) languageterritory の区切り。territory を省略する場合は不要です。
territory プログラムの実行場所が属する国名。このパラメータによって、通貨記号、数値におけるコンマ (,) とピリオド (.) の用法、および文字の照合順序が指定されます。territory を省略すると、language で指定した言語のデフォルトの国名が使用されます。国名は、ISO3166 などの規格で標準化された省略語で指定します。次にいくつかの例を示します。
GB = 英国
FR = フランス
TW = 中国 (繁体字)
CN = 中国 (簡体字)
JP = 日本
. (ピリオド) territorycodepage の区切り。codepage を省略する場合は不要です。
codepage プログラムで使用する文字集合。このパラメータを省略すると、languageterritory の設定に対応する標準文字集合が使用されます。

territorycodepage に指定できる値については、使用しているオペレーティングシステムのマニュアルを参照してください。

ロケールの設定例

SCO UNIX (または AIX) 上でのロケール設定の例を次に示します。この例は、言語としてフランス語、国名にフランス、文字集合に ISO 8859-1 を設定しています。

LANG=fr_FR
export LANG

8.6 NLS 対応プログラムの開発

NLS をサポートするプログラムを作成するには、コンパイル時に NLS 指令を指定する必要があります。NLS 指令はデフォルトでは使用されません。この章の以降の内容では、NLS 指令を使用してコンパイルされたプログラムを「NLS 対応プログラム」と呼びます。

NLS 対応プログラムを開発する際には、次の構文規則に従う必要があります。

アプリケーションの開発時には、どのプログラムも NLS 対応にすることが可能です。その結果、1 つのアプリケーション内に NLS 対応プログラムと NLS に対応しないプログラムが混在することもあります。詳細については、後述の『NLS 対応プログラムと非対応プログラムの混在』を参照してください。

8.7 NLS 対応プログラムの実行

NLS 対応プログラムは、NLS 対応でないプログラムと同じ方法で実行します。

ランタイムシステムが NLS を初期化するのは、アプリケーションの実行中に一度のみです。つまり、NLS 対応プログラムが最初に呼び出されたときに NLS が初期化されます。ランタイムシステムは、そのプログラム用に設定すべき言語環境を LANG 環境変数 を基に決定します。いったん設定された言語環境は、同じアプリケーションで以降に呼び出されるすべての NLS 対応プログラムで使用されます。詳細については、後述の『NLS 対応プログラムと非対応プログラムの混在』を参照してください。

LANG 環境変数で指定された言語がサポートされていない場合など、NLS の初期化でエラーが発生すると、ランタイムシステムはエラーメッセージを表示して終了します。NLS 関連のエラーメッセージは、『エラーメッセージで詳しく説明しています。

NLS 指令を指定する場合は、可変長レコードを含む索引ファイルは使用しないでください。

言語環境と異なる文字の照合順序で作成した索引ファイルは使用できません。そのような索引ファイルを使用すると、プログラム内で入出力状態を指定している場合に、 COBOL システムが入出力状態 9/45 を返します。入出力状態を指定していない場合は、ランタイムシステムによってエラーメッセージが生成されます。

NLS 対応プログラムの実行中には、LANG 環境変数で指定された言語によって次の動作が左右されます。

言語に依存するその他の要素 (小数点を表す記号や通貨記号など) も、指定された言語の形式で表示されます。ただし、通貨記号を数値の後に付ける言語については、COBOL の通常の規則が適用されます。

一部の NLS 定義では、数字として ASCII の 0 〜 9 以外の文字が定義されています。ところが、これらの文字は ACCEPT 構文で 数字項目に格納したり、演算で処理することができません。そのため、COBOL 環境における NLS 処理では、数字項目を構成する文字が ASCII の 0 〜 9 および符号 (+/-) のみに限定されています。NLS によるその他の数字表現を、対応する ASCII 文字に自動変換する方法はありません。

ヨーロッパ言語では、修飾文字が ACCEPT の数字項目に格納される可能性がありますが、これらの文字はゼロとして処理されます。

LOW-VALUES などの定数に割り当てられた値は、NLS を使用しても変化しません。

次の場合は、予期しない結果が発生します。

NLS 対応プログラムでは、Adis Flip Case Control キーを使用して大文字と小文字を相互に変換できます。ただし、このキーでヨーロッパ言語の大文字変換を試み、対応する大文字が存在しない場合は、対象文字が空白で置き換えられます。

プログラムの実行方法の詳細については、『Server Express ユーザガイド』を参照してください。

8.7.1 文字列の比較

NLS 対応プログラムで文字列を比較する場合は、ランタイムシステムによって CBL_NLS_COMPARE ルーチンが呼び出されます。英数字の比較でも、組み込み関数 (Max、Min、Ord-max、または Ord-min) による英数字項目の処理を含む場合には、このルーチンが呼び出されます。

英数字データの他の項目への MOVE 操作中に、移動先のサイズが移動元より大きい場合は、その差が空白文字により埋められます。サイズが異なる 2 つの項目を比較する場合も、その差が空白文字であると想定されます。どちらの場合も、ASCII の空白文字が使用されます。

8.7.2 クラス状態のテスト

NLS 対応プログラムの実行中にクラス状態をテストする必要が生じたときには、ランタイムシステムがロケールの設定に応じて適切なテストを実行します。このテストでは、情報文字列が ALPHABETIC、ALPHABETIC-UPPER、ALPHABETIC-LOWER、NUMERIC のいずれの形式であるか調べられます。数字テストでは、すべての文字が ASCII の 0 〜 9 の範囲内かどうかがチェックされます。

8.7.3 索引順ファイル内のキー比較

ランタイムシステムは、CBL_NLS_COMPARE ルーチンを使用して、NLS ファイルに関連付けられたキーを比較します。

索引順ファイルの論理ファイル名の先頭の 5 文字が %NLS% の場合は、そのファイルが LANG 環境変数で指定された文字の照合順序に従ってキー設定されたファイルとして扱われます。これは、その論理ファイル名の環境変数による変換前または変換後であるかどうかにかかわらず適用されます。さらに、そのファイルを開くプログラムが NLS 指令を使用してコンパイルされている場合にのみ適用されます。

環境変数を使用して変換された論理ファイル名の先頭が %NLS% の場合、そのファイルを開こうとしているプログラムが NLS を使用してコンパイルされていない場合は、 OPEN 処理が失敗し、ランタイムシステムエラーが返されます。

可変長レコードを含むファイルには、NLS 文字の照合順序は使用されません。

環境変数を使用して変換される論理ファイル名の割り当てについては、『ファイル操作』の『ファイル名』の章を参照してください。

8.7.4 SORT と MERGE による比較

NLS 対応プログラムが SORT または MERGE を実行する場合は、自動的に NLS キーが比較されます。

ただし、作業ファイルの論理ファイル名の先頭に ASSIGN 文で文字列、 %NLS% が付加されており、さらにそのファイルを開くプログラムが NLS をサポートしている必要があります。これについては、前項の索引順ファイルについての説明と同じです。

SORT や MERGE の処理でキーが比較されるたびに、ランタイムシステムによって CBL_NLS_COMPARE ルーチンが呼び出されます。

8.7.5 大文字と小文字の変換

NLS 対応プログラムが組み込み関数 (Upper-case、Lower-case) やライブラリルーチン (CBL_TOUPPER、CBL_TOLOWER) を使用して大文字と小文字の変換を実行する場合は、指定されている言語を正しく変換するためのルーチンがランタイムシステムによって呼び出されます。

8.7.6 照合順序を使用する処理

NLS 対応プログラムでは、ロケールに応じて適切な文字の照合順序が使用されます。組み込み関数、 Char および Ord を使用して照合順序が実行される場合は、この特殊な照合順序が使用されます。

8.7.7 数値の編集と編集取り消し

NLS 対応プログラムで数値の編集やその取り消しを行う場合は、ロケールに応じて適切な小数点と 1000 桁の区切り文字が使用されます。使用される通貨記号は、ロケールに指定された国の通貨記号の先頭文字です。

8.7.8 組み込み関数 Numval および Numval-c

NLS 対応プログラムが組み込み関数 (Numval または Numval-c) を使用して、DISPLAY 項目に格納された数字や金額を表す文字列を数値に変換する場合は、ランタイムシステムによってロケールに応じた小数点と 1000 桁の区切り文字が使用されます。また、Numval-c の 第 2 パラメータを省略した場合は、ロケールに指定された国の通貨記号が使用されます。

8.7.9 ユーザインターフェイス

使用している言語環境に関する情報は、Server Express の NLS ライブラリルーチンで取得できます。該当する各ルーチンの詳細については、この章の後の項で説明します。

言語環境の情報は、 nl_langinfo() などの UNIX オペレーティングシステムルーチンでも取得できますが、プログラムの移植性が限定されます。これらのルーチンの詳細については、使用しているオペレーティングシステムのマニュアルを参照してください。

8.8 NLS 対応プログラムと非対応プログラムの混在

複数のプログラムから構成されるアプリケーションでも、 NLS 対応とするプログラムのみに NLS 指令を指定すれば十分です。NLS 対応プログラムと NLS に対応していない (NLS 非対応) プログラムは、互いに両方のプログラムを呼び出すことができます。

NLS 対応プログラムは、関連付けられた専用の言語やロケールを持たず、アプリケーションロケールを使用します。アプリケーションロケールは、アプリケーションで NLS 対応プログラムが最初に呼び出されたときに NLS と共に初期化されます。

初期化されたアプリケーションロケールは、それ以降に呼び出されるすべての NLS 対応プログラムで使用されます。いったん設定された言語環境は、アプリケーションの実行中には変更できません。LANG 環境変数の設定を変更しても、アプリケーションの実行中に反映されることはありません。そのため、1 つのアプリケーションで各 NLS 対応プログラムが同じ言語を使用することを確認してください。

NLS 対応プログラムでは、必要に応じて NLS ライブラリルーチンを呼び出すことができます。これらのルーチンは NLS 非対応プログラムでも呼び出し可能ですが、NLS 対応プログラムの呼び出しによって NLS が初期化され、すでにロードされている必要があります。

NLS 対応プログラムは NLS 非対応プログラムにパラメータを渡すことができます。ただし、言語環境に依存するパラメータは、実際に使用される言語環境にかかわらずパラメータ作成元の形式を維持するため、NLS 対応プログラムで作成したパラメータを NLS 非対応プログラムで使用すると、予期しない結果が生じる可能性があります。そのため、NLS 対応プログラムで作成したパラメータは、言語環境が同じプログラム以外には渡すべきではありません。

8.9 NLS メッセージファイルの作成

表示されるメッセージの言語も指定できます。必要な言語で作成したメッセージをメッセージカタログ内に作成し、CBL_NLS_READ_MSG などの NLS ライブラリルーチンを使用してアクセスします。メッセージの表示言語は、環境変数、 $LC_MESSAGES (または $LANG) を使用して実行時に指定できます。

UNIX 上のアプリケーションで表示するメッセージは、メッセージカタログに格納しておく必要があります。メッセージカタログを作成するには、メッセージ文字列を含むソースメッセージファイルを作成し、gencat コマンドでコンパイルします。

メッセージファイルはメッセージを記述した複数の行から構成され、拡張子、 .src を持ちます。このファイルには、次の規則に従ってメッセージを記述します。

$ comment ドル記号 ($) と空白文字 (またはタブ) で始まる行はコメントとして解釈されます。
$set n メッセージセットを指定し、その番号を n で割り当てます。この行と次の $set 行の間に位置する各メッセージ行は、すべて同じメッセージセットに属します。メッセージセットの番号は昇順で割り当てますが、連番である必要はありません。$set を指定しない場合は、デフォルトセットが使用されます。デフォルトセットの定義は COBOL システムの実装によって異なるため、必ずしも番号が 1 になるとは限りません。
$quote c c に引用文字を指定します。この引用文字でメッセージ文字列を囲めば、空白文字やヌル文字列のメッセージを正しく表示できます。$quote 指令を指定しない、または c を省略した場合には、引用文字はすべて無視されます。
m message-text message-text に指定したメッセージ文字列は m に指定したメッセージ番号とともに、$set 文で指定された現在のメッセージセットに格納されます。メッセージ番号は昇順で割り当てますが、連番である必要はありません。
空白行 空白行はすべて無視されます。

次にメッセージファイルの例を示します。

$quote "  
  
$  
$set 1  
1 "Too small a starting balance to open this type of account"
2 "This debit exceeds overdraft limit"  
3 "This debit overdraws account"  
$ *********************************************************** 

このファイルから UNIX メッセージカタログを作成するには、次のように gencat コマンドを使用します。

gencat -m errmsg.lng errmsg.src

errmsg.src がメッセージファイルの名前です。コンパイル後のメッセージカタログは、errmsg.lng ファイルに格納されます。


注: 一部の UNIX プラットフォームでは gencat の -m フラグは不要ですが、つねに上記のコマンドを入力するようにしてください。gencat コマンドの詳細については、gencat の man ページを参照してください。


コンパイルしたメッセージカタログを使用するには、$NLSPATH 環境変数を正しく設定する必要があります。次に例を示します。

export NLSPATH=`pwd`/%N:$NLSPATH

%N の部分が、実行時にメッセージファイル名で置き換えられます。

いくつかのメッセージファイルを異なる言語で作成した場合には、それぞれのファイルを異なるサブディレクトリに格納します。これらのサブディレクトリには、該当するロケールの名前を付けます。たとえば、英語とフランス語のメッセージファイルを作成した場合には、次の一連のコマンドを実行します。

mkdir msgs
mkdir msgs/en_GB msgs/en_US msgs/C msg/fr_FR
gencat -m errmsg.lng errmsg.src
ln errmsg.lng msgs/en_GB
ln errmsg.lng msgs/en_US
ln errmsg.lng msgs/en_C
rm -f errmsg.lng
gencat -m errmsg.lng errmsg.src.fr
mv errmsg.lng msgs/en_FR

この処理の終了後に、次のように $NLSPATH を設定します。

export NLSPATH=`pwd`/msgs/%L/%N:$NLSPATH

%L はロケール名 ($LANG の値)、%N はメッセージファイル名によって、それぞれ実行時に置き換えられます。

8.10 NLS ライブラリルーチン

NLS 対応プログラムの開発時には、次の NLS ライブラリルーチンを利用できます。

CBL_NLS_CLOSE_MSG_FILE NLS メッセージファイルを閉じる。
CBL_NLS_COMPARE 2 つの文字列を比較する。
CBL_NLS_INFO 言語情報を取得/設定する。
CBL_NLS_OPEN_MSG_FILE NLS メッセージファイルを開く。
CBL_NLS_READ_MSG メッセージファイルからメッセージを読み取る。

これらのルーチンを呼び出すことができるのは、NLS 指令を使用してコンパイルされたプログラムのみです。

8.11 ASCII と EBCDIC の相互変換

データは通常、ASCII 形式で使用しますが、Server Express では EBCDIC 形式のデータも使用できます。データを EBCDIC 形式で保存すると、メインフレーム向けに開発しているプログラムを、より確実にテストできるようになり、使用しているシステムとメインフレーム間のデータ交換も円滑に行われます。

EBCDIC 形式のデータを使用するには、プログラムが ASCII 形式であることを確認した後、CHARSET(EBCDIC) 指令を指定してコンパイルします。データファイルを変換する必要はありません。

Server Express は、デフォルトでは PC コードページ 437 から派生した US コードページで ASCII/EBCDIC 変換を実行しますが、極東言語やドイツ語を変換するためのモジュールも定義されています。これらの言語用の文字コードと EBCDIC との変換が必要な場合には、デフォルトのモジュールを該当する文字集合用のモジュールで置き換えてください。

8.11.1 CHARSET 指令による ASCII/EBCDIC 変換

ASCII 文字集合と EBCDIC 文字集合のデータ間で相互変換を行うには、プログラムを CHARSET 指令でコンパイルします。CHARSET 指令は次のように指定します。

CHARSET "character-set"

character-set に ASCII または EBCDIC を指定します。

CHARSET 指令を指定すると、関連する NATIVE 指令と SIGN 指令も自動的に設定されます。たとえば、CHARSET(EBCDIC) を指定した場合には、SIGN(EBCDIC) と NATIVE(EBCDIC) も指定されます。

呼び出し元と呼び出し先のプログラムは、どちらも同じ CHARSET 指令でコンパイルする必要があります。

EBCDIC オプションを指定してコンパイルしたプログラムは、EBCDIC 環境のメインフレーム上でコンパイルしたプログラムと同様のデータ部を持ちます。つまり、DISPLAY 型の値は EBCDIC 形式、COMP 型の項目は 2 進項目になります。同様に、手続き部で使用されているリテラル (MOVE "HELLO" TO FRED や MOVE ALL "X" TO FRED など) も、すべて EBCDIC 形式になります。手続き部のコードは、数値データを含むあらゆる DISPLAY 型データが EBCDIC 形式であると想定します。

文字と 2 進データで構成されるレコードをファイルから正しく読み取るには、メインフレームの場合と同様、COBOL プログラム側に適切なレコード定義が必要です。つまり、ユーザがアクセスする可能性があるデータ (ファイルのレコードや作業場所節の項目など) は、メインフレーム上とまったく同様に扱う必要があります。

EBCDIC 対応プログラムによる ASCII データの取り扱いで、留意すべき点は次のとおりです。

8.11.2 ASCII および EBCDIC 対応に関する制限

ASCII および EBCDIC 対応には、次の制限があります。

8.11.3 ASCII および EBCDIC の照合順序

ASCII と EBCDIC では文字の照合順序が異なるため、EBCDIC から ASCII に変換したデータの比較処理は、変換前と同じ結果になるとは限りません。ASCII で定義されている数字とアルファベットの大文字と小文字の順序は、EBCDIC の定義とは異なります。具体的には、ASCII では数字 (16 進数の 30 〜 39) が大文字 (16 進数の 41 〜 5A) より前に位置し、大文字に続いて小文字 (16 進数の 61 〜 7A) が位置しています。

ところが、EBCDIC では小文字 (16 進数の 81 〜 89、91 〜 99、A2 〜 A9)、大文字 (16 進数の C1 〜 C9、D1 〜 D9、E2 〜 E9)、数字 (16 進数の F0 〜 F9) の順序であり、しかも範囲内に特殊文字が散在しています。

次のサンプルコードは、ASCII と EBCDIC のどちらを使用しているかによって異なる結果を表示します。

 data division
 working-storage section.

 01 item-1    pic x value"a".
 01 item-2    pic x value"a".
      ...
 procedure division
      ...
     if item-1 < item-2
         display "ASCII"
     else
         display "EBCDIC"
     end-if

プログラムの照合順序が有効な場合は、英数字項目 (集団項目を含む) を比較すると、多くの場合、無意味な結果が返されます。

たとえば、次の 2 つの項目を比較する場合について考えてみましょう。

ASCII 形式では field-afield-b より小さくなりますが、EBCDIC 形式を使用する場合は x"4F" が EBCDIC の "O" (x"D6") に、x"5F" が EBCDIC の下線 ( x"6D") にそれぞれマッピングされます。そのため、NATIVE(EBCDIC) 指令を指定してコンパイルしたプログラムでは、field-afield-b より大きくなります。

文字の照合順序の違いによって影響される処理には、IF 文、SORT 文、および索引ファイルへのデータの書き出しのほか、EBCDIC の 16 進数値を含むデータを前提とした処理 (空白文字を X"40" で扱う場合など) が挙げられます。

8.11.4 _CODESET プログラムによる ASCII/EBCDIC 変換

通常のアプリケーションでは CHARSET 指令によって ASCII/EBCDIC 変換に対処しますが、_CODESET プログラムを呼び出して変換する必要が生じる場合もあります。

_CODESET プログラムの呼び出し構文は次のとおりです。

構文
call "_CODESET" using function-code, text-length, text-string
パラメータ
function-code pic 9(2) comp-x
text-length pic 9(9) comp-x
text-string pic x(n)
入力
function-code 変換の種類を指定する機能コード

0 EBCDIC から ASCII に変換
1 ASCII から EBCDIC に変換
2 EBCDIC から ASCII に変換。256 バイトの変換表全体を使用し、text-length の値は無視する。
3 ASCII から EBCDIC に変換。256 バイトの変換表全体を使用し、text-length の値は無視する。
4 DBCS EBCDIC から DBCS PC コードに変換
5 DBCS PC コードから DBCS EBCDIC に変換

text-length text-string のデータ長
text-string 変換する文字列
出力
text-string 変換後の文字列
備考

_CODESET プログラムは、メインフレーム用 COBOL コンパイラ (OSVS for OS/VS COBOL、VSC2 for VS COBOL II など) 用の予約語指令を使用してコンパイルされたプログラムから呼び出すことはできません。_CODESET プログラムは COMP-X を使用しますが、このデータ型はメインフレームではサポートされていないためです。

_CODESET プログラムは 1 バイト文字の変換のみに使用してください。function-code パラメータは常に 0 または 1 に指定します。

8.11.5 Codecomp ユーティリティによる _CODESET の設定

Codecomp ユーティリティを使用すると、1 バイト文字のみが変換されるように _CODESET プログラムの設定を変更できます。

_CODESET を実行すると、マッピング設定を含む CSnnnn.extnnnn は識別番号、ext は実行可能ファイルを示す拡張子)という名前のプログラムが呼び出されます。この CSnnnn.ext ファイルを独自に作成すると、_CODESET が利用するマッピング情報を制御できます。_CODESET が使用する CSnnnn.ext ファイルは、MFCODESET 環境変数で指定します。必要な手順は次のとおりです。

  1. Codecomp ユーティリティを使用して、必要なマッピングを指定します。この結果、CSnnnn.ext で使用される .cpy ファイルが生成されます。

  2. CSnnnn.ext ファイルを再コンパイルします。

Codecomp ユーティリティは次の処理を実行します。

8.11.5.1 マッピングファイルの作成

Codecomp ユーティリティを使用すると、使用中の EBCDIC/ASCII 変換方式を出力したマッピングファイルを作成できます。マッピングファイルの作成には、MFCODESET 環境変数の設定が使用されます。マッピングファイルを作成するには、次の形式で Codecomp ユーティリティを実行します。

codecomp -p filename-1 [filename-2]

各パラメータの説明は次のとおりです。

-p 使用中のマッピングテーブルをファイルに出力するように指定します。
name-1, name-2 現在の変換方式の出力先マッピングファイルの名前。出力するマッピングテーブルの種類を示す拡張子を付けます。ASCII から EBCDIC への変換には .a2e、EBCDIC から ASCII への変換には .e2a という拡張子をつけます。

出力ファイルを指定しないとエラーになります。コマンド行の指定によるエラーが発生すると、コマンド行の構文を示すヘルプメッセージが表示されます。

8.11.5.2 新しい変換方式の指定

新しい変換方式を指定するには、次の形式で Codecomp ユーティリティを実行します。

codecomp name-1 [name-2]

各パラメータの説明は次のとおりです。

name-1, name-2

マッピング設定を含むマッピングファイル。ファイル名には、格納されているマッピングテーブルの種類を示す拡張子を付けます。ASCII から EBCDIC への変換には .a2e、EBCDIC から ASCII への変換には .e2a という拡張子を付けます。

ファイルを 1 つのみ指定した場合は、ファイルの表の逆を意味する表が第 2 の表であると想定されます。この場合、指定されたファイルの表の 2 列めに、0 〜 255 までのすべての値が含まれている必要があります。

入力ファイルを指定しないとエラーになります。コマンド行の指定によるエラーが発生すると、コマンド行の構文を示すヘルプメッセージが表示されます。

このコマンドを実行すると、必要な EBCDIC/ASCII 変換方式を含むコピーファイル (codeset.cpy) が生成されます。このコピーファイルが変換ファイル (CSnnnn.ext) によって使用されます。変換ファイルは、ロケールに応じて独自に作成することが可能です。作成方法については、次の手順を参照してください。

Server Express には、変換ファイル作成用のテンプレートが付属しています。このファイルは CSnnnn.cbl という名前で $COBDIR/src/codeset ディレクトリに格納されています。たとえば、変換ファイルを CS2001.gnt という名前で作成するには次の手順に従います。

  1. 次のようなコマンドを実行して CSnnnn.cbl ファイルをコピーし、カレントディレクトリに CS2001.cbl ファイルを作成します。
    cp $COBDIR/src/codeset/CSnnnn.cbl CS2001.cbl
  2. 作成した CS2001.cbl ファイルをコンパイルして実行可能ファイルを作成します。
    cob -u CS2001.cbl 

    このコマンドを実行すると、CS2001.gnt ファイルが作成されます。

  3. 作成した実行可能ファイルを $COBDIR/dynload ディレクトリにコピーします。

続いて、使用する変換表を、次の形式で MFCODESET 環境変数に指定します。

MFCODESET=nnnn

nnnn には 2000 〜 9999 の範囲内で適切な値を指定します。2000 未満の値は Micro Focus 社用に予約されています。

MFCODESET の設定によって、_CODESET が呼び出すマッピングファイルが決定されます。たとえば、CS2001.gnt ファイルを作成して $COBDIR/dynload ディレクトリにコピーした場合には、MFCODESET は次のように設定します。

MFCODESET=2001

_CODESET は CS2001.gnt ファイル内の変換表を使用します。

8.11.5.3 Codecomp 用のマッピングファイルの形式

マッピングファイルの形式を次に示します。

     $ identifying-string 
     ; date/time 
                   00        corresponding-value
                   01              .... 
                   02              .... 
                   .               .... 
                   .               .... 

マッピングファイルを作成または編集する場合は、次の点に留意してください。

いくつかのマッピングパターンの関係を次に示します。

1:1 有効
複数:1 有効 (2 つの入力ファイルを指定した場合のみ)
1:複数 無効
複数:複数 無効

8.11.5.4 Codecomp による _CODESET の設定例

独自に作成した変換表 (CS2001.gnt) が使用されるように、 _CODESET プログラムの設定を変更する手順を次に示します。

  1. 次のコマンドを実行し、_CODESET のソースからマッピングファイルを作成します。
    codecomp -p map.a2e map.e2a

    ASCII から EBCDIC への変換表が map.a2e、EBCDIC から ASCII への変換表が map.e2a にそれぞれ出力されます。

  2. 必要に応じてマッピングファイルの内容を編集します。

  3. 次のコマンドを実行し、ソース (codeset.cpy) を変更します。
    codecomp map.a2e map.e2a
  4. 使用しているロケールに応じて任意の値を作成し、その値に対応する名前のファイルに、 CSnnnn.cbl ファイルをコピーします。たとえば、ある国のロケールの値を 2001 に決定した場合は、次のコマンドを実行して CSnnnn.cblCS2001.cbl にコピーします。
    cp $COBDIR/src/codeset/CSnnnn.cbl CS2001.cbl 
  5. 次のコマンドを実行し、CS2001.cbl を実行可能ファイルに変換します (この例では、生成ファイルを作成します)。
    cob -u CS2001.gnt
  6. 作成した CS2001.gnt ファイルを $COBDIR/dynload ディレクトリにコピーします。

  7. MFCODESET 環境変数の値を、作成した実行可能ファイルの番号 (手順 4 で決定した値) に設定します。
    MFCODESET=2001

8.11.6 _CODESET プログラムの手動設定

_CODESET プログラムの設定を 1 バイト文字用に変更する処理は、手動で実行することも可能です。手動による変更では、ソースファイルに変更を加えて再コンパイルし、生成したモジュールを COBOL システムにビルドします。

_CODESET プログラムのソースとコピーファイルは、Server Express のインストールディレクトリ内の src サブディレクトリに格納されています。ソース内の 256 バイトの変換表に変更を加えます。変換表を変更する場合は、変換前の文字のバイナリ値に 1 を加えた値を、その表の索引として付ける必要があります。索引を付けた位置の文字が、変換後の文字として使用されます。

_CODESET のソースに必要な変更を加えた後、再コンパイルして実行可能ファイルを作成し、適切なパッケージ化を施します。再コンパイル以降の手順は、_CODESET を Codecomp ユーティリティで設定する場合と同じです。


Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標および商品名は国際著作権法で保護されています。

前ページへ 移植可能なプログラムの作成 NLS の実装例次ページへ