OpenVMS
HP C ランタイム・ライブラリ・
リファレンス・マニュアル (上巻)


前へ 次へ 目次 索引


10.7 異なる文字セットの取り扱い

HP C RTL では,ASCII でエンコーディングされた Portable Character Set を含む数多くの状態独立コードセットおよびコードセット・エンコード方式がサポートされます。状態依存コードセットはサポートされません。サポートされるコードセットは次のとおりです。

10.7.1 charmap ファイル

コードセット内の文字は charmap ファイルに定義されています。弊社が提供する charmap ファイルは, SYS$I18N_LOCALE 論理名によって定義されるディレクトリにあります。 charmap ファイルのファイル・タイプは .CMAP です。

10.7.2 コンバータ関数

HP C RTL では異なる文字セットをサポートするだけでなく,文字をあるコードセットから別のコードセットに変換するための次のコンバータ関数も提供しています。

10.7.3 コードセット・コンバータ・ファイルの使用

コードセット・コンバータのファイル命名規則は次のとおりです。


fromcode_tocode.iconv 

ただし,fromcode はソース・コードセットの名前であり, tocode は文字の変換先のコードセットの名前です。

コードセット・コンバータをシステムに追加するには, SYS$I18N_ICONV という論理名によって示されるディレクトリにコンバータ・ファイルをインストールします。

コードセット・コンバータ・ファイルは,テーブル・ベースの変換ファイルとしてインプリメントすることができ, OpenVMS 共用可能イメージとして作成されたアルゴリズム・ベースのコンバータ・ファイルとしてインプリメントすることもできます。

テーブル・ベースの変換ファイルの作成

テーブル・ベースのコードセット・コンバータ・ファイルを作成するには,次の手順を実行します。

  1. ソース・コードセットの文字とターゲット・コードセットの文字の対応関係を記述したテキスト・ファイルを作成します。このファイルの形式については, OpenVMS New Features Manual の DCL コマンド ICONV COMPILE を参照してください。このコマンドはこのようなファイルを処理し,コードセット・コンバータ・テーブル・ファイルを作成します。

  2. ステップ 1 で作成したファイルを論理名 SYS$I18N_ICONV によって示されるディレクトリにコピーします。この操作を実行するための特権が必要です。

アルゴリズム・ベースの変換ファイルの作成

共用可能イメージとしてインプリメントされたアルゴリズム・ベースのコードセット・コンバータ・ファイルを作成するには,次の操作を実行します。

  1. コードセット・コンバータをインプリメントする C ソース・ファイルを作成します。 API はパブリック・ヘッダ・ファイル <iconv.h>に次のように指定されています。

  2. コードセット・コンバータを構成するモジュールを OpenVMS の共用可能イメージとしてコンパイルおよびリンクします。その場合,ファイル名が上記の規則に従っているかどうか確認されます。

  3. 上記のステップで作成されたファイルを SYS$I18N_ICONV という論理名によって示されるディレクトリにコピーします。この操作を実行するための特権が必要です。

追加注意事項

デフォルト設定では,SYS$I18N_ICONV は検索リストであり,リスト SYS$SYSROOT:[SYS$I18N.ICONV.USER] 内の最初のディレクトリは, iconvコードセット・コンバータのサイト固有のリポジトリとして使用されます。

インストールされているコードセットとロケールの数はシステムごとに異なります。システムにイントスールされているコードセット,コンバータ,ロケールについては, SYS$I18N ディレクトリ・ツリーを確認してください。

10.8 カルチャー固有の情報の取り扱い

各ロケールには,次のカルチャー情報が格納されています。

このカルチャー情報は, nl_langinfo関数と localeconv関数を使用して部分的に取り出すことができます。 第 10.8.1 項 を参照してください。

10.8.1 ロケールからのカルチャー情報の抽出

nl_langinfo関数は,プログラムの現在のロケールから取得した情報項目を含む文字列を指すポインタを返します。ロケールから抽出できる情報は次のとおりです。

localeconv関数は,LC_NUMERIC カテゴリと LC_MONETARY カテゴリから数値の書式データと通貨の書式データを格納した構造体を指すポインタを返します。

10.8.2 日付と時刻の書式関数

日付および時刻情報を使用する関数は次のとおりです。

10.8.3 通貨書式設定関数

strfmon関数はロケール内の通貨情報を使用して,数値を文字列に変換します。文字列の書式は書式設定文字列によって制御されます。

10.8.4 数値の書式設定

LC_NUMERIC 内の情報はさまざまな関数で使用されます。たとえば, strtodwcstod,およびプリント関数やスキャン関数は, LC_NUMERIC カテゴリから小数点文字を判断します。

10.9 ワイド文字を取り扱うための関数

文字はコードセットに応じて,シングル・バイトまたはマルチバイトの値で表現できます。シングル・バイト文字とマルチバイト文字をどちらも同じ方法で簡単に取り扱うことができるように, HP C RTL ではワイド文字データ型 wchar_tを定義しています。このデータ型は,1 バイト,2 バイト,3 バイト,4 バイトのいずれかの値で表現される文字を格納できます。

ワイド文字をサポートするために提供される関数は次のとおりです。

10.9.1 文字分類関数

ロケール内の LC_CTYPE カテゴリは,ロケールのコードセットに含まれる文字を異なるタイプ ( 英字,数字,小文字,大文字など ) に分類します。 2 組の関数があり,1 組はワイド文字用,もう 1 組はシングル・バイト文字用で,文字が特定のタイプであるかどうかを判定します。 is*関数はシングル・バイト文字を判定し, isw*関数はワイド文字を判定します。

たとえば, iswalnum関数は,ワイド文字が英字として分類されるのか,数字として分類されるのを判定します。文字がこれらのいずれかのタイプである場合は,0 以外の値を返します。分類関数の詳細については, 第 3 章 と「リファレンス・セクション」を参照してください。

10.9.2 大文字/小文字変換関数

LC_CTYPE カテゴリは,ロケールの 2 組の文字の間のマッピングを定義します。最も一般的な文字マッピングは大文字と小文字の間のマッピングです。しかし,ロケールでは大文字と小文字のマッピング以外のマッピングもサポートできます。

ロケールの LC_CTYPE カテゴリの情報に従って,ある文字を別の文字に変換するために 2 つの関数が用意されています。

大文字と小文字の間のマッピングのために 2 つの関数が用意されています。

これらの関数の詳細については,「リファレンス・セクション」を参照してください。

10.9.3 ワイド文字の入出力のための関数

複数の入出力関数によって,ワイド文字およびワイド文字の文字列が管理されます。

読み込み関数

ワイド文字とワイド文字の文字列を読み込むための関数は, fgetwcfgetwsgetwcgetwcharです。

ワイド文字を入力ストリームに戻すための ungetwc関数も用意されています。

書き込み関数

ワイド文字およびワイド文字の文字列を書き込むための関数は, fputwcfputwsputwcputwcharです。

スキャン関数

スキャン関数はすべて,現在のロケールの LC_NUMERIC カテゴリに定義されているカルチャー固有の小数点文字を検索します。

%lc,%C,%ls,%S 変換指定子を使用すると,スキャン関数 fwscanfwscanfswscanffscanfscanfsscanfはワイド文字を読み込むことができます。

プリント関数

すべてのプリント関数は,現在のロケールの LC_NUMERIC カテゴリに定義されているデータに従って,数値の書式を設定できます。

プリント関数で使用される %lc,%C,%ls,%S 変換指定子は,ワイド文字をマルチバイト文字に変換し,変換結果の文字をプリントします。

入出力関数の詳細については, 第 2 章 を参照してください。

10.9.4 マルチバイト文字とワイド文字の変換のための関数

ワイド文字は通常,シングル・バイト文字やマルチバイト文字をアプリケーションで管理するために内部的に使用されます。しかし,テキスト・ファイルは一般にマルチバイト文字形式で格納されます。これらのファイルを処理するには,マルチバイト文字をワイド文字形式に変換する必要があります。この変換は次の関数を使用して行うことができます。

同様に,次の関数はワイド文字を対応するマルチバイト文字に変換します。

これらの変換関数に関連して, mblen関数と mbrlen関数はマルチバイト文字のサイズを判断するために使用されます。

複数のワイド文字関数は,「 mbstate_tを指すポインタ」型の引数を受け付けます。ただし, mbstate_tは状態依存コードセットの変換状態を保持するために使用される opaque データ型です ( FILEfpos_tなど)。

10.9.5 ワイド文字の文字列および配列を操作するための関数

HP C RTL には,ワイド文字の文字列を操作する関数 ( wcs* 関数と wmem* 関数) があります。たとえば, wcscat関数は, strcat関数が char 型の文字列に対して動作する方法と同じ方法で,ワイド文字の文字列を別の文字列の末尾に追加します。

文字列操作関数の詳細については, 第 3 章 を参照してください。

10.10 照合関数

国際化環境では,文字列比較関数はマルチパス照合ができなければなりません。照合する場合は次の要件を満たす必要があります。

照合順序情報はロケールの LC_COLLATE カテゴリに格納されています。 HP C RTL には,この照合順序情報を使用して 2 つの文字列を比較するために, strcoll関数と wcscoll関数が用意されています。

strcollまたは wcscollによるマルチパス照合は, strcmp関数や wcscmp関数を使用するより速度が遅くなる可能性があります。プログラムで strcollまたは wcscollを使用して多くの文字列の比較を行う必要がある場合は, strxfrmまたは wcsxfrm関数を使用して文字列をいったん変換した後, strcmp関数や wcscmp関数を使用すると,処理速度を向上できます。

照合順序という用語は,文字の相対的な順序のことを示します。照合順序はロケール固有であり,一部の文字は無視されることがあります。たとえば,米語の辞書では単語の間のハイフンは無視され, take-out という用語は takeofftakeover の間にリストされます。

一方,比較という用語は,文字が同じであるのか,異なるのかを調べることを意味します。たとえば, takeouttake-out は照合順序が同じであっても,異なる単語です。

アプリケーションで単語のリストをソートした後,バイナリ検索を実行して単語を迅速に検索できるようにする場合について考えてみましょう。 strcmp関数を使用すると, take-intake-outtake-up はテーブルの 1 つの部分にまとめられます。 strcollを使用し,ハイフンを無視するロケールを使用すると, take-outtakeoff および takeover と同じグループにまとめられますが,takeout と重複すると解釈されます。バイナリ検索で takeouttake-out の複製として検索されるのを回避するには,アプリケーションでバイナリ・ツリーを作成するために strcollではなく, strcmpを使用する必要があります。


前へ 次へ 目次 索引