| 前へ | 次へ | 目次 | 索引 |
TOLLIVER という名前のユーザがプログラムを実行すると, stdoutに次の情報が表示されます。
$ RUN EXAMPLE1 Initiating user: TOLLIVER |
例 9-2 は, getenv関数の使用方法を示しています。
| 例 9-2 端末情報へのアクセス |
|---|
/* CHAP_9_GETTERM.C */
/* Using getenv, this program returns the terminal. */
#include <stdio.h>
#include <stdlib.h>
main()
{
printf("Terminal type: %s\n", getenv("TERM"));
}
|
132 カラム・モードの VT100 端末で 例 9-2 を実行すると,次の情報が表示されます。
$ RUN EXAMPLE3 Terminal type: vt100-132 |
例 9-3 は, getenvを使用してユーザのデフォルト・ログイン・ディレクトリを調べる方法と, chdirを使用してそのディレクトリに変更する方法を示しています。
| 例 9-3 デフォルト・ディレクトリの操作 |
|---|
/* CHAP_9_CHANGE_DIR.C */
/* This program performs the equivalent of the DCL command */
/* SET DEFAULT SYS$LOGIN. However, once the program exits, the */
/* directory is reset to the directory from which the program */
/* was run. */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
main()
{
char *dir;
int i;
dir = getenv("HOME");
if ((i = chdir(dir)) != 0) {
perror("Cannot set directory");
exit(0);
}
printf("Current directory: %s\n", dir);
}
|
例 9-3 を実行すると,次の情報が表示されます。
$ RUN EXAMPLE4 Current directory: dba0:[tolliver] $ |
例 9-4 は, time, localtime, strftime関数を使用して端末に正しい日付と時刻をプリントする方法を示しています。
| 例 9-4 日付と時刻のプリント |
|---|
/* CHAP_9_DATE_TIME.C */
/* The time function returns the time in seconds; the localtime */
/* function converts the time to hours, minutes, and so on; */
/* the strftime function uses these values to obtain a string */
/* in the desired format. */
#include <time.h>
#include <stdio.h>
#define MAX_STRING 80
main()
{
struct tm *time_structure;
time_t time_val;
char output_str[MAX_STRING];
time(&time_val);
time_structure = localtime(&time_val);
/* Print the date */
strftime(output_str, MAX_STRING,
"Today is %A, %B %d, %Y", time_structure);
printf("%s\n", output_str);
/* Print the time using a 12-hour clock format. */
strftime(output_str, MAX_STRING,
"The time is %I:%M %p", time_structure);
printf("%s\n", output_str);
}
|
例 9-4 を実行すると,次の情報が表示されます。
$ RUN EXAMPLE5 Today is Thursday, May 20, 1993 The time is 10:18 AM $ |
この章では,国際化ソフトウェアの典型的な機能と,国際化ソフトウェアを設計およびインプリメントするために HP C Run-Time Library (RTL) で提供される機能について説明します。
この章で説明する関数の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)』「リファレンス・セクション」を参照してください。
10.1 国際化のサポート
HP C RTL では,アプリケーション開発者が国際化ソフトウェアを作成するための機能が追加されました。 HP C RTL は,ロケール・ファイルから言語とカルチャーに関する情報を読み込んで取得します。
10.1.1 インストール
これらの HP C RTL 機能を使用する場合は,システムにこれらのファイルを提供するために別のキットをインストールする必要があります。
OpenVMS VAX システムでは,セーブ・セット VMSI18N0nn は OpenVMS オペレーティング・システムと同じメディアで提供されます。
OpenVMS Alpha システムでは,セーブ・セットは Layered Product CD で提供されます。名前は,VMSI18N0nn または ALPVMSI18N0n_07nn です。
このセーブ・セットをインストールするには,このセーブ・セット名をキットの名前として使用して,標準的な OpenVMS のインストール手順に従います。複数のロケール・カテゴリをインストールのために選択できます。次のプロンプトに応答することにより,必要な数だけロケールを選択できます。
* Do you want European and US support? [YES]? * Do you want Chinese GB18030 support (locale and Unicode converters) [YES]? * Do you want Chinese support? [YES]? * Do you want Japanese support? [YES]? * Do you want Korean support? [YES]? * Do you want Thai support? [YES]? * Do you want the Unicode converters? [YES]? |
このキットには Installation Verification Procedure も含まれています。キットが正しくインストールされたかどうかを検証するには,このプロシージャを実行することをお勧めします。
10.1.2 Unicode のサポート
OpenVMS バージョン 7.2 で, HP C ランタイム・ライブラリに Universal Unicode ロケールが追加されました。このロケールは VMSI18N0nn キットではなく, OpenVMS システムに付属しています。 Unicode ロケールの名前は次のとおりです。
UTF8-20 |
VMSI18N0nn キットに付属しているロケールと同様に, Unicode ロケールは SYS$I18N_LOCALE 論理名によって参照される標準的なディレクトリにあります。
UTF8-20 Unicode は,Unicode 標準バージョン V2.0 をベースにしています。 Unicode ロケールでは,ワイド文字エンコーディングとして UCS-4 を使用し,マルチバイト文字エンコーディングとして UTF-8 を使用します。
HP C RTL には,Unicode と他のサポートされる文字セットの間の変換を実行するコンバータも含まれています。コンバータの拡張セットには,UCS-2,UCS-4, UTF-8 の Unicode エンコーディングのためのコンバータが含まれています。 Unicode コンバータは ICONV CONVERT ユーティリティで使用することができ, HP C ランタイム・ライブラリの iconv関数ファミリで使用することもできます。
OpenVMS バージョン 7.2 では, HP C ランタイム・ライブラリで Microsoft Code Page 437 のための Unicode 文字セット・コンバータが追加されました。
10.2 国際化ソフトウェアの機能
国際化ソフトウェアとは,複数の言語とカルチャーをサポートできるソフトウェアです。国際化プログラムは次のことができなければなりません。
上記の要件を満たすには,アプリケーションで言語,各国の習慣,使用される文字セットに関する何らかの仮定を行うべきではありません。このような各国対応データはすべて,プログラムとは別に定義し,実行時に割り当てるようにしなければなりません。
この章では, HP C を使用して国際化ソフトウェアを作成する方法について説明します。
10.3 HP C を使用した国際化ソフトウェアの開発
HP C 環境では,国際化ソフトウェアを開発するために次の機能が提供されます。
ロケールは異なるカテゴリで構成されており,各カテゴリは国際化環境の 1 つの要素を定義します。 表 10-1 はロケールのカテゴリと,各カテゴリの説明を示しています。
| カテゴリ | 説明 |
|---|---|
| LC_COLLATE | 照合順序に関する情報が格納されている。 |
| LC_CTYPE | 文字の分類に関する情報が格納されている。 |
| LC_MESSAGES | yes/no プロンプトに対する応答として期待される応答を定義する。 |
| LC_MONETARY | 通貨の書式情報が格納されている。 |
| LC_NUMERIC | 数値の書式情報が格納されている。 |
| LC_TIME | 時刻と日付の情報が格納されている。 |
提供されるロケールは, SYS$I18N_LOCALE 論理名によって定義されるディレクトリにあります。ロケールのファイル命名規則は次のとおりです。
language_country_codeset.locale |
ただし,
アプリケーションでは,実行時に setlocaleを呼び出すことにより国際化環境を設定します。国際化環境は次のいずれかの方法で設定します。
setlocale関数の構文は次のとおりです。
char *setlocale(int category, const char *locale) |
ただし,
language_country.codeset[@modifier] |
たとえば,
setlocale(LC_COLLATE, "en_US.ISO8859-1")は,LC_COLLATE カテゴリに対してロケール en_US.ISO8859-1 を選択します。
アプリケーションで setlocale関数を呼び出さなかった場合は,デフォルト・ロケールは C ロケールになります。この場合,このようなアプリケーションは現在のロケールで情報を使用する関数を呼び出すことができます。
setlocale関数を呼び出すときに, locale 引数として "" を指定した場合,関数はいくつか論理名を調べて,指定されたカテゴリのロケール名を判断します。
国際化環境を定義するためにユーザが設定できる論理名は数多くあります。
ユーザが定義する論理名の他に,システム・スタートアップ時に設定される多くのシステム単位の論理名があり,これらの論理名はシステムのすべてのユーザのデフォルトの国際化環境を定義します。
setlocale関数は,最初にユーザ定義論理名を確認し,そのような論理名が定義されていない場合は,システム論理名を確認します。
10.6 メッセージ・カタログの使用
国際化ソフトウェアの重要な要件は,ユーザの独自の言語でユーザと通信できなければならないということです。メッセージング・システムを導入することにより,プログラム・メッセージをプログラム・ソースと別に作成し,実行時にプログラムにリンクすることができます。
メッセージはメッセージ・テキスト・ソース・ファイルに定義され, GENCAT コマンドを使用してメッセージ・カタログにコンパイルされます。メッセージ・カタログは, HP C RTL で提供される関数を使用してプログラムからアクセスできます。
カタログに格納されているメッセージにアクセスするために提供される関数は次のとおりです。
メッセージ・カタログの作成の詳細については, OpenVMS システムのドキュメントの GENCAT コマンドの説明を参照してください。
| 前へ | 次へ | 目次 | 索引 |