|
移植可能なプログラムの作成 |
NLS の実装例 |
この章では、Server Express の各国語対応について説明します。
Server Express は、次の各水準で各国語に対応しています。
NLS は、プログラムで使用する文字集合を固定することなく、世界各国で使用されている多彩なシングルバイト文字集合、文字の照合順序、および通貨編集記号に柔軟に対応するための機能です。この機能は、英語圏における文字集合の処理や大小文字の照合、および適切な通貨記号の選択にも役立ちます。
NLS で対応できる言語と文字集合の一部を次に示します。
| ISO646 および派生規格 | フランス語、独語、スエーデン語、デンマーク語、イタリア語、スペイン語、ポルトガル語 |
| ISO8859/1 | 西ヨーロッパの各言語 |
| IBM PC 8 ビット文字集合 | 西ヨーロッパの各言語 |
NLS 指令を使用してコンパイルしたプログラムは、言語環境変数で指定された言語、国、および文字集合に従って動作します。
DBCS サポートを利用すると、日本、中国、韓国など、2 バイト文字を使用する諸国向けのアプリケーションを開発できます。
Server Express の日本語版は DBCS を完全にサポートしています(英語版は部分的にサポート)。
DBCS 対応アプリケーションは ACCEPT/DISPLAY と PIC X など、既存のツールと構文で開発することも可能ですが、Server Express では DBCS 環境で使用されるその他の COBOL 構文も使用できます。これらの構文については、『言語リファレンス - 追加トピック』で説明されています。DBCS サポートを有効化するには、DBCS、NCHAR、JAPANESE のいずれかのコンパイラ指令を使用します。
CBL_GET_OS_INFO ライブラリルーチンを使用すると、アプリケーションで極東諸国の文字集合を識別することができます。詳細については、『ライブラリルーチン』を参照してください。
DBCS 透過性は、さまざまなプラットフォーム版の Object COBOL でサポートされています。詳細については、DBCS サポートに関するオンラインマニュアルを参照してください。
DBCS 透過性のサポートにより、アプリケーションのユーザは、1 バイト文字と 2 バイト文字が混在した母国語を入力、格納、操作、表示、および印刷できます。さらに、Animator、Editor、Screens などのツールを使用して、母国語対応アプリケーションプログラムの作成や保守を行うことも可能です。
バックスペース、削除、挿入、カーソル移動などの編集操作は、すべてバイト単位です。たとえば、2 バイト文字を 1 文字削除する場合には、Delete キーを続けて 2 回押し、文字を構成する 2 つのバイトを削除します。一方のバイトを削除した時点で残りのバイトの表示が乱れる場合がありますが、このバイトは Delete キーをもう一度押せば削除され、表示も正常に戻ります。
なお、使用するツールや端末環境によっては、2 バイト文字の編集やカーソル移動が、バイト単位ではなく文字単位で実行される場合もあります。
次の 2 つのツールでは、DBCS の透過性のサポートは限定されています。これらのツールについては、『Utilities Handbook』を参照してください。
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 ソース内の該当文字を変更する必要があります。
Object COBOL での DBCS アプリケーション開発には、標準の PIC X のほか、次の項目が使用できます。
注: DBCS クラスの識別子に形式 4 または形式 5 の ACCEPT 文を実行する場合は、入力するデータを 2 バイト文字のみに限定する必要があります。『言語リファレンス - 追加トピック』の『2 バイト文字支援機能』を参照してください。
Object COBOL では、CHARSET コンパイラ指令と _CODESET プログラムを使用して ASCII と EBCDIC の相互変換を行うことができます。いくつかの _CODESET プログラムは、一部の極東言語と独語の ASCII および EBCDIC コードページ (文字集合) を処理するように定義されています。
NLS または DBCS の透過性をサポートするには、次の条件を満たす必要があります。
Server Express が提供する、指定された言語、国、および文字コード用の言語テーブルは、UNIX に依存します。この言語テーブルはロケールと呼ばれます。
NLS または DBCS をサポートするプログラムを UNIX 上で実行する前に、言語環境変数でロケールを設定する必要があります。ロケールは、言語、地域、および文字集合から構成されます。
ロケールはすでに設定されている可能性もあります。未設定の場合には、次の構文で設定します。
LANG=language[_territory[.codepage]] export LANG
各パラメータの内容は、次のとおりです。
territory と codepage に指定できる値については、使用しているオペレーティングシステムのマニュアルを参照してください。
SCO UNIX (または AIX) 上でのロケール設定の例を次に示します。この例は、言語としてフランス語、国名にフランス、文字集合に ISO 8859-1 を設定しています。
LANG=fr_FR export LANG
NLS をサポートするプログラムを作成するには、コンパイル時に NLS 指令を指定する必要があります。NLS 指令はデフォルトでは使用されません。この章の以降の内容では、NLS 指令を使用してコンパイルされたプログラムを「NLS 対応プログラム」と呼びます。
NLS 対応プログラムを開発する際には、次の構文規則に従う必要があります。
PROGRAM COLLATING SEQUENCE IS alphabet-name
alphabet-name IS
STANDARD-1
NATIONAL
literal-1 THRU literal-2
CURRENCY SIGN IS literal
DECIMAL-POINT IS COMMA
COLLATING SEQUENCE IS alphabet-name.
アプリケーションの開発時には、どのプログラムも NLS 対応にすることが可能です。その結果、1 つのアプリケーション内に NLS 対応プログラムと NLS に対応しないプログラムが混在することもあります。詳細については、後述の『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 ユーザガイド』を参照してください。
NLS 対応プログラムで文字列を比較する場合は、ランタイムシステムによって CBL_NLS_COMPARE ルーチンが呼び出されます。英数字の比較でも、組み込み関数 (Max、Min、Ord-max、または Ord-min) による英数字項目の処理を含む場合には、このルーチンが呼び出されます。
英数字データの他の項目への MOVE 操作中に、移動先のサイズが移動元より大きい場合は、その差が空白文字により埋められます。サイズが異なる 2 つの項目を比較する場合も、その差が空白文字であると想定されます。どちらの場合も、ASCII の空白文字が使用されます。
NLS 対応プログラムの実行中にクラス状態をテストする必要が生じたときには、ランタイムシステムがロケールの設定に応じて適切なテストを実行します。このテストでは、情報文字列が ALPHABETIC、ALPHABETIC-UPPER、ALPHABETIC-LOWER、NUMERIC のいずれの形式であるか調べられます。数字テストでは、すべての文字が ASCII の 0 〜 9 の範囲内かどうかがチェックされます。
ランタイムシステムは、CBL_NLS_COMPARE ルーチンを使用して、NLS ファイルに関連付けられたキーを比較します。
索引順ファイルの論理ファイル名の先頭の 5 文字が %NLS%
の場合は、そのファイルが LANG 環境変数で指定された文字の照合順序に従ってキー設定されたファイルとして扱われます。これは、その論理ファイル名の環境変数による変換前または変換後であるかどうかにかかわらず適用されます。さらに、そのファイルを開くプログラムが
NLS 指令を使用してコンパイルされている場合にのみ適用されます。
環境変数を使用して変換された論理ファイル名の先頭が %NLS% の場合、そのファイルを開こうとしているプログラムが NLS
を使用してコンパイルされていない場合は、 OPEN 処理が失敗し、ランタイムシステムエラーが返されます。
可変長レコードを含むファイルには、NLS 文字の照合順序は使用されません。
環境変数を使用して変換される論理ファイル名の割り当てについては、『ファイル操作』の『ファイル名』の章を参照してください。
NLS 対応プログラムが SORT または MERGE を実行する場合は、自動的に NLS キーが比較されます。
ただし、作業ファイルの論理ファイル名の先頭に ASSIGN 文で文字列、 %NLS% が付加されており、さらにそのファイルを開くプログラムが NLS をサポートしている必要があります。これについては、前項の索引順ファイルについての説明と同じです。
SORT や MERGE の処理でキーが比較されるたびに、ランタイムシステムによって CBL_NLS_COMPARE ルーチンが呼び出されます。
NLS 対応プログラムが組み込み関数 (Upper-case、Lower-case) やライブラリルーチン (CBL_TOUPPER、CBL_TOLOWER) を使用して大文字と小文字の変換を実行する場合は、指定されている言語を正しく変換するためのルーチンがランタイムシステムによって呼び出されます。
NLS 対応プログラムでは、ロケールに応じて適切な文字の照合順序が使用されます。組み込み関数、 Char および Ord を使用して照合順序が実行される場合は、この特殊な照合順序が使用されます。
NLS 対応プログラムで数値の編集やその取り消しを行う場合は、ロケールに応じて適切な小数点と 1000 桁の区切り文字が使用されます。使用される通貨記号は、ロケールに指定された国の通貨記号の先頭文字です。
NLS 対応プログラムが組み込み関数 (Numval または Numval-c) を使用して、DISPLAY 項目に格納された数字や金額を表す文字列を数値に変換する場合は、ランタイムシステムによってロケールに応じた小数点と 1000 桁の区切り文字が使用されます。また、Numval-c の 第 2 パラメータを省略した場合は、ロケールに指定された国の通貨記号が使用されます。
使用している言語環境に関する情報は、Server Express の NLS ライブラリルーチンで取得できます。該当する各ルーチンの詳細については、この章の後の項で説明します。
言語環境の情報は、 nl_langinfo() などの UNIX オペレーティングシステムルーチンでも取得できますが、プログラムの移植性が限定されます。これらのルーチンの詳細については、使用しているオペレーティングシステムのマニュアルを参照してください。
複数のプログラムから構成されるアプリケーションでも、 NLS 対応とするプログラムのみに NLS 指令を指定すれば十分です。NLS 対応プログラムと NLS に対応していない (NLS 非対応) プログラムは、互いに両方のプログラムを呼び出すことができます。
NLS 対応プログラムは、関連付けられた専用の言語やロケールを持たず、アプリケーションロケールを使用します。アプリケーションロケールは、アプリケーションで NLS 対応プログラムが最初に呼び出されたときに NLS と共に初期化されます。
初期化されたアプリケーションロケールは、それ以降に呼び出されるすべての NLS 対応プログラムで使用されます。いったん設定された言語環境は、アプリケーションの実行中には変更できません。LANG 環境変数の設定を変更しても、アプリケーションの実行中に反映されることはありません。そのため、1 つのアプリケーションで各 NLS 対応プログラムが同じ言語を使用することを確認してください。
NLS 対応プログラムでは、必要に応じて NLS ライブラリルーチンを呼び出すことができます。これらのルーチンは NLS 非対応プログラムでも呼び出し可能ですが、NLS 対応プログラムの呼び出しによって NLS が初期化され、すでにロードされている必要があります。
NLS 対応プログラムは NLS 非対応プログラムにパラメータを渡すことができます。ただし、言語環境に依存するパラメータは、実際に使用される言語環境にかかわらずパラメータ作成元の形式を維持するため、NLS 対応プログラムで作成したパラメータを NLS 非対応プログラムで使用すると、予期しない結果が生じる可能性があります。そのため、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 はメッセージファイル名によって、それぞれ実行時に置き換えられます。
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 指令を使用してコンパイルされたプログラムのみです。
データは通常、ASCII 形式で使用しますが、Server Express では EBCDIC 形式のデータも使用できます。データを EBCDIC 形式で保存すると、メインフレーム向けに開発しているプログラムを、より確実にテストできるようになり、使用しているシステムとメインフレーム間のデータ交換も円滑に行われます。
EBCDIC 形式のデータを使用するには、プログラムが ASCII 形式であることを確認した後、CHARSET(EBCDIC) 指令を指定してコンパイルします。データファイルを変換する必要はありません。
Server Express は、デフォルトでは PC コードページ 437 から派生した US コードページで ASCII/EBCDIC 変換を実行しますが、極東言語やドイツ語を変換するためのモジュールも定義されています。これらの言語用の文字コードと 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 データの取り扱いで、留意すべき点は次のとおりです。
call data-name
assign to data-name (Micro Focus による拡張)
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 つの項目を比較する場合について考えてみましょう。
field-a − x"4F" (ASCII コードで O に相当) を含む PIC X 項目field-b − x"5F" (同じく下線に相当) を含む PIC X 項目ASCII 形式では field-a は field-b より小さくなりますが、EBCDIC 形式を使用する場合は
x"4F" が EBCDIC の "O" (x"D6")
に、x"5F" が EBCDIC の下線 ( x"6D") にそれぞれマッピングされます。そのため、NATIVE(EBCDIC)
指令を指定してコンパイルしたプログラムでは、field-a が field-b より大きくなります。
文字の照合順序の違いによって影響される処理には、IF 文、SORT 文、および索引ファイルへのデータの書き出しのほか、EBCDIC の 16 進数値を含むデータを前提とした処理 (空白文字を X"40" で扱う場合など) が挙げられます。
通常のアプリケーションでは 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 |
変換の種類を指定する機能コード
|
||||||||||||
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 に指定します。
Codecomp ユーティリティを使用すると、1 バイト文字のみが変換されるように _CODESET プログラムの設定を変更できます。
_CODESET を実行すると、マッピング設定を含む CSnnnn.ext (nnnn は識別番号、ext は実行可能ファイルを示す拡張子)という名前のプログラムが呼び出されます。この CSnnnn.ext ファイルを独自に作成すると、_CODESET が利用するマッピング情報を制御できます。_CODESET が使用する CSnnnn.ext ファイルは、MFCODESET 環境変数で指定します。必要な手順は次のとおりです。
Codecomp ユーティリティは次の処理を実行します。
Codecomp ユーティリティを使用すると、使用中の EBCDIC/ASCII 変換方式を出力したマッピングファイルを作成できます。マッピングファイルの作成には、MFCODESET 環境変数の設定が使用されます。マッピングファイルを作成するには、次の形式で Codecomp ユーティリティを実行します。
codecomp -p filename-1 [filename-2]
各パラメータの説明は次のとおりです。
-p |
使用中のマッピングテーブルをファイルに出力するように指定します。 |
name-1, name-2 |
現在の変換方式の出力先マッピングファイルの名前。出力するマッピングテーブルの種類を示す拡張子を付けます。ASCII から EBCDIC への変換には .a2e、EBCDIC から ASCII への変換には .e2a という拡張子をつけます。 |
出力ファイルを指定しないとエラーになります。コマンド行の指定によるエラーが発生すると、コマンド行の構文を示すヘルプメッセージが表示されます。
新しい変換方式を指定するには、次の形式で 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 という名前で作成するには次の手順に従います。
cp $COBDIR/src/codeset/CSnnnn.cbl CS2001.cbl
cob -u CS2001.cbl
このコマンドを実行すると、CS2001.gnt ファイルが作成されます。
続いて、使用する変換表を、次の形式で MFCODESET 環境変数に指定します。
MFCODESET=nnnn
nnnn には 2000 〜 9999 の範囲内で適切な値を指定します。2000 未満の値は Micro Focus 社用に予約されています。
MFCODESET の設定によって、_CODESET が呼び出すマッピングファイルが決定されます。たとえば、CS2001.gnt ファイルを作成して $COBDIR/dynload ディレクトリにコピーした場合には、MFCODESET は次のように設定します。
MFCODESET=2001
_CODESET は CS2001.gnt ファイル内の変換表を使用します。
マッピングファイルの形式を次に示します。
$ identifying-string
; date/time
00 corresponding-value
01 ....
02 ....
. ....
. ....
マッピングファイルを作成または編集する場合は、次の点に留意してください。
identifying-string は必須です。行の先頭にドル記号 ($) を入力し、続いて識別用の文字列を入力します。この行は、常にファイルの先頭 (コメントを除く) に記述してください。この規則に従わない場合にはエラーになり、Codecomp は _CODESET の設定を変更せずに終了します。いくつかのマッピングパターンの関係を次に示します。
| 1:1 | 有効 |
| 複数:1 | 有効 (2 つの入力ファイルを指定した場合のみ) |
| 1:複数 | 無効 |
| 複数:複数 | 無効 |
独自に作成した変換表 (CS2001.gnt) が使用されるように、 _CODESET プログラムの設定を変更する手順を次に示します。
codecomp -p map.a2e map.e2a
ASCII から EBCDIC への変換表が map.a2e、EBCDIC から ASCII への変換表が map.e2a にそれぞれ出力されます。
codecomp map.a2e map.e2a
cp $COBDIR/src/codeset/CSnnnn.cbl CS2001.cbl
cob -u CS2001.gnt
MFCODESET=2001
_CODESET プログラムの設定を 1 バイト文字用に変更する処理は、手動で実行することも可能です。手動による変更では、ソースファイルに変更を加えて再コンパイルし、生成したモジュールを COBOL システムにビルドします。
_CODESET プログラムのソースとコピーファイルは、Server Express のインストールディレクトリ内の src サブディレクトリに格納されています。ソース内の 256 バイトの変換表に変更を加えます。変換表を変更する場合は、変換前の文字のバイナリ値に 1 を加えた値を、その表の索引として付ける必要があります。索引を付けた位置の文字が、変換後の文字として使用されます。
_CODESET のソースに必要な変更を加えた後、再コンパイルして実行可能ファイルを作成し、適切なパッケージ化を施します。再コンパイル以降の手順は、_CODESET を Codecomp ユーティリティで設定する場合と同じです。
Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標および商品名は国際著作権法で保護されています。
| 移植可能なプログラムの作成 | NLS の実装例 |