## 3.2 C++ ロケール

C++ のロケールは、標準 C++ ライブラリで提供されるロケールというクラスです。C++ クラスロケールが C 言語でのロケールと違う点は、単なる言語テーブルや、さまざまな文化や言語に依存するデータの表現法ではないということです。C では大域関数になる国際化サービスも、C++ のロケールの一部です。

C++ では、国際化の意味論にはファセットという分割されたクラスで対応しています。 各ファセットでは、通貨の値の形式など、国際化サービスのセットを処理します。ファセットは、通貨情報の規則や記号など文化や言語に依存する情報のセットを表すこともあります。

ロケールオブジェクトは、ファセットオブジェクトのセットを保持します。以下の図 5に示すように、C++ ロケールはファセットのコンテナと考えることもできます。

#### 図 5 --ファセットのコンテナとなる C++ ロケール

### 3.2.1 ファセット

ファセット クラスでは、文化と言語に依存するデータをカプセル化して、関連のある国際化サービスを提供します。ファセットクラスは非常に柔軟性が高く、どのような国際化サービスをユーザーが開発しても、ファセットクラスに組み入れることができます。標準 C++ ライブラリには多くの標準ファセットがあらかじめ用意してあり、C ライブラリにあるサービスとよく似たサービスを提供しています。ただし、別の国際化サービスを新しいファセットクラスにバンドルしたり、ファセットライブラリを購入することができます。

#### 3.2.1.1 標準ファセット

表 1 にあるように、C 言語でのロケールは、LC_NUMERIC (数字の規則と記号)、LC_TIME (日付と時間の情報)、LC_MONETARY (通貨情報の規則と記号)、LC_CTYPE (文字の分類と変換)、LC_COLLATE (照合順序)、LC_MESSAGES (メッセージの形式と値)という 6 つのロケールに依存する情報のカテゴリから構成されます。

同様に、標準ファセットクラスのセットが 6 つあります。これらのファセットの詳細は、『標準 C++ クラスライブラリ・リファレンス』で説明していますが、その簡単な概要を以下に説明します。num_get <charT,InputIterator> のような略語表現では、num_get は、文字型と入力反復子の型という 2 つのテンプレート引数をとるクラステンプレートであることを表します。標準ファセットのグループを以下に示します。

- 数字。ファセットクラス num_get<charT,InputIterator> と num_put<charT,OutputIterator> では、数字の形式と構文解析を処理します。このファセットクラスでは、long 型と double 型などの値に使用するメンバー関数である get() と put() があります。

ファセットクラス numpunct<charT> では、数字の区切りを指定します。decimal_point() や thousands_sep() などの関数があります。

- 時間。ファセットクラス time_get<charT,InputIterator> と time_put<charT,OutputIterator> では、日付と時間の形式と構文解析を処理します。get_time()、get_date()、get_weekday() などの関数があります。
- 通貨。ファセットクラス money_get<charT,InputIterator> と money_put<charT,OutputIterator> では、通貨の形式と構文解析を処理します。通貨の最小単位のカウントなど、桁のシーケンスを解析したり生成するメンバー関数 get() と put() があります。たとえば、アメリカ合衆国の標準ロケールの $1,056.23 を最小単位で表現すると、105623 または文字シーケンスでは "105623"になります。
  ファセット numpunct<charT> で数字の区切りを処理するように、ファセットクラス moneypunct<charT,bool> では、通貨の区切りを処理します。curr_symbol() などの関数があります。
- C 型。ファセットクラス ctype<charT> には、tolower()、toupper()、isspace()、isprint() など文字分類に使用する標準 C++ ライブラリの ctype 機能がすべて含まれます。
  ファセットクラス codecvt<internT,externT,stateT> は、複数バイト符号化 JIS からワイド文字符号化ユニコードへの変換など、符号化スキーマの変換時に使用します。主なメンバー関数は、`in() と out()` です。複数バイトからワイドの文字への変換専用のテンプレートとして <wchar_t,char,mbstate_t> があります。
- 照合。ファセットクラス collate<charT> では、文字列の比較に使用するcompare() 関数など、文字列の照合に対応しています。
- メッセージ。ファセットクラス messages<charT> は X/Open のメッセージ検索機能を実装したものです。open() と close(catalog) によるメッセージカタログへのアクセス、および get(..., int msgid,...) によるメッセージの検索に対応しています。

標準ファセットの名前は、一定の規則に従っています。num_get と time_get などの get ファセットクラスでは、構文解析を処理します。put ファセットクラスでは書式設定を行います。punct ファセットクラスは、numpunct や moneypunct のように、規則と記号を表します。

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。

OEM リリース, 1998 年 6 月