A    国際化インタフェースの要約表

この付録では,『X/Open CAE Specification, System Interfaces and Headers (XSH) Version 5』に規定されている,国際化インタフェース (WPI : Worldwide Portability Interfaces) の一覧と要約を示します。 これらのインタフェースはすべて,ワイド文字データ型をサポートしています。 またこの付録中の表には,char データ型を使用する古い ISO C 関数もリストされています。 ただし,それらの関数では,すべての言語で文字ベースの処理を行うことはできません。 各インタフェースの詳細については,リファレンス・ページ (manpages) をお読みください。 XSH Version 5 に準拠する定義環境でプログラムをコンパイルする方法については, standards(5) のリファレンス・ページを参照してください。

A.1    ロケール宣言

プログラムは次の関数を呼び出して,実行時に適切なロケール (言語,地域,およびコードセット) を使用します。

WPI 関数 説明
setlocale() 実行時に地域化データを設定します。

A.2    文字分類

以下の文字分類関数は,ロケール・カテゴリ LC_CTYPE で定義されているコードセットに従って値を分類します。

WPI 関数 ISO C の等価関数 説明
iswalnum() isalnum() 文字が英数字かどうかをテストします。
iswalpha() isalpha() 文字が英字かどうかをテストします。
iswcntrl() iscntrl() 文字が制御文字かどうかをテストします。
iswdigit() isdigit() 文字が移植可能な文字セット中の 10 進数かどうかをテストします。
iswgraph() isgraph() 文字が図形文字かどうかをテストします。
iswlower() islower() 文字が英字の小文字かどうかをテストします。
iswprint() isprint() 文字が印字可能かどうかをテストします。
iswpunct() ispunct() 文字が区切り文字かどうかをテストします。
iswspace() isspace() 文字が空白文字かどうかをテストします。
iswupper() isupper() 文字が英字の大文字かどうかをテストします。
iswxdigit() isxdigit() 文字が移植可能な文字セット中の 16 進数かどうかをテストします。

文字分類関数に加え,WPI にはすべての分類カテゴリに対して共通のインタフェースとなる次の関数が用意されています。

上記の表の WPI 関数は,次の表に示す wctype()iswctype() 関数の呼び出しで置き換えることができます。

分類関数を使用する呼び出し wctype( ) と iswctype( ) を使用する等価な呼び出し
iswalnum(wc ) iswctype(wc , wctype("alnum"))
iswalpha(wc ) iswctype(wc , wctype("alpha"))
iswcntrl(wc ) iswctype(wc , wctype("cntrl"))
iswdigit(wc ) iswctype(wc , wctype("digit"))
iswgraph(wc ) iswctype(wc , wctype("graph"))
iswlower(wc ) iswctype(wc , wctype("lower"))
iswprint(wc ) iswctype(wc , wctype("print"))
iswpunct(wc ) iswctype(wc , wctype("punct"))
iswspace(wc ) iswctype(wc , wctype("space"))
iswupper(wc ) iswctype(wc , wctype("upper"))
iswxdigit(wc ) iswctype(wc , wctype("xdigit"))

上記の表で,wctype() 呼び出しに指定されている二重引用符で囲まれたリテラルは,X/Open UNIX 標準で西ヨーロッパ言語とほとんどの東ヨーロッパ言語のロケールに対して共通に定義されている文字クラスです。 ただし,ロケールでは他の文字クラスを定義することもできます。 Unicode 標準ではクラス固有の関数を持たない文字クラスを定義し, アジア系言語のロケールでは追加の文字クラスを定義して,表意文字と表音文字を区別できます。 クラス固有の関数が存在しない場合に,ある文字があるクラスに属するかどうかをテストする場合は,wctypeiswctype 関数を使用する必要があります。 XSH および Unicode 標準で定義されている文字クラスの詳細については, locale(4) を参照してください。

また,isw*() 関数の入力値は,現在のロケールで定義されているワイド文字の範囲に入っていなければなりません。 入力値が範囲外の場合,その結果は不定です。 詳細については, iswctype(3) のリファレンス・ページを参照してください。

注意

上記の表の 2 番目の欄の wctype() 呼び出しにより,その動作が 1 番目の欄の関数と同等な iswctype() 呼び出しになります。 ほとんどのアプリケーションでは,wctype() の 1 回の呼び出しに対し,iswctype() を複数回呼び出す必要があります。 このような場合,表の 2 カラム目の関数を使用して,1 カラム目の関数と同じ処理を行うようコーディングすることもできます。

wctype_t    property_handle;
wint_t      wc;
int         yes_or_no;
 .
 .
 .
     property_handle=wctype("alnum");
 .
 .
 .
     while (...) {
       .
       .
       .
     yes_or_no=iswctype(wc, property_handle);
       .
       .
       .
     }
 

A.3    大文字/小文字変換と汎用プロパティ変換

次の大文字/小文字変換関数を使って,ロケール・カテゴリ LC_CTYPE で定義されているコードセットに従い,ワイド文字の大文字/小文字変換を行います。

WPI 関数 ISO C の等価関数 説明
towlower() tolower() 英大文字を英小文字に変換します。
towupper() toupper() 英小文字を英大文字に変換します。

また WPI には,現ロケールで定義されているプロパティに従ってワイド文字をマップしたり,変換するための関数も用意されています。

現時点では,Tru64 UNIX ロケールで定義されているプロパティは,touppertolowerだけです。 以下に towupper() と同等な変換処理を行う,wctrans()towctrans() を使用したプログラム例を示します。

wint_t     from_wc, to_wc;
wctrans_t  conv_handle;
.
.
.
       conv_handle=wctrans("toupper");
.
.
.
       while (...) {
         .
         .
         .
       to_wc=towctrans(from_wc,conv_handle);
         .
         .
         .
       }
 
 

A.4    文字照合

次の WPI 関数は,LC_COLLATE カテゴリで定義されているロケール規則に従って,ワイド文字列をソートします。

WPI 関数 ISO C 等価関数 説明
wcscoll() strcoll() 文字列を照合します。

A.11 節に要約されている wcsxfrm()wcscmp() 関数を使用して,ワイド文字列を変換し比較することもできます。

A.5    言語と文化習慣によって異なるデータへのアクセス

次の WPI 関数を使用すると,ロケール設定で指定された言語や国固有のデータをプログラムで取得できます。

WPI 関数 説明
nl_langinfo() ロケール設定に従って,言語や文化データを取得するための汎用関数です。
strfmon() ロケール設定に従って,金額を書式付けます。
localeconv() ロケール設定に従って,数値を書式付けるための情報を返します。

A.6    日付/時刻の変換と書式付け

ctime()asctime() 関数には,言語に依存しない処理を実行する柔軟性はありません。 そのため,WPI にはロケール設定に従って日付と時刻の文字列を書式付ける,次の関数が用意されています。

WPI 関数 説明
strftime() 指定された書式文字列とロケール設定に従って,日付と時刻の文字列を書式付けます。
wcsftime() 指定された書式文字列とロケール設定に従って日付と時刻を書式付けして,結果をワイド文字配列に返します。
strptime() 指定された書式文字列に従って,文字列を日付と時刻の値に変換します。 strftime() の逆の処理を行います。

A.7    テキストの書き込みと読み取り

WPI では国際化に対応するように,以下の ISO C 関数の定義を拡張しています。 WPI における定義の拡張については,関数表の後で説明します。

WPI/ISO C 関数 説明
fprintf() vararg パラメータ・リストを使用して,書式付き出力をファイルに書き込みます。
fwprintf() vararg パラメータ・リストを使用して,書式付きワイド文字を指定された出力ストリームに書き込みます。
printf() vararg パラメータ・リストを使用して,書式付き出力を標準出力ストリームに書き込みます。
   
sprintf() vararg パラメータ・リストを使用して,1 つまたは複数の値を書式付け,出力を文字列に書き込みます。
swprintf() vararg パラメータ・リストを使用して,書式付きワイド文字を指定されたアドレスに書き込みます。
vfprintf() stdarg パラメータ・リストを使用して,書式付き出力をファイルに書き込みます。
vfwprintf() stdarg パラメータ・リストを使用して,書式付きワイド文字を指定された出力ストリームに書き込みます。
vprintf() stdarg パラメータ・リストを使用して,書式付き出力を標準出力ストリームに書き込みます。
vsprintf() stdarg パラメータ・リストを書式付け,出力を文字列に書き込みます。
vswprintf() stdarg パラメータ・リストを使用して,書式付き出力を指定されたアドレスに書き込みます。
vwprintf() stdarg パラメータ・リストを使用して,書式付きワイド文字を標準出力に書き込みます。
wprintf() vararg パラメータ・リストを使用して,書式付きワイド文字を標準出力に書き込みます。
fscanf() ファイルからの書式付き入力を変換します。
fwscanf() 指定された出力ストリームからの書式付きワイド文字を変換します。
scanf() 標準入力ストリームからの書式付き入力を変換します。
sscanf() 文字列からの書式付きデータを変換します。
swscanf() 指定したアドレスの書式付きワイド文字を変換します。
wscanf() 標準入力からの書式付きワイド文字を変換します。

上記の関数群における WPI 拡張は次のとおりです。

A.8    数値変換

次の表の関数は,ワイド文字列をさまざまな数値形式に変換します。

WPI 関数 ISO C の等価関数 説明
wcstod() strtod() ワイド文字列の先頭部分を倍精度の浮動小数点数に変換します。
wcstol() strtol() ワイド文字列の先頭部分を long 型の整数値に変換します。
wcstoul() strtoul() ワイド文字列の先頭部分を unsigned long 型の整数値に変換します。

A.9    マルチバイト文字とワイド文字の変換

アプリケーションがマルチバイト形式で外部ファイルとのデータのやり取りを行い,そのデータを内部的にワイド文字形式で処理できるようにするために,WPI には,以下の表に示すように,マルチバイト・データとワイド文字データの間の変換を行う関数が用意されています。

WPI 関数 説明
btowc() シングルバイトをマルチバイト文字形式からワイド文字形式に変換します。
mblen()

ロケール設定に従って,文字のバイト数を調べます。 この関数を呼び出すには,1 バイトの文字サイズを前提としているすべての文字列処理文を変更する必要があります。 以下の文は,次の文字へのポインタ cp を更新します。

cp++;

使用する言語に関係なく,mblen() 関数が正しく動作する呼び出し例を,次に示します。 MB_CUR_MAX 変数は文字を構成する最大バイト数であり,ロケールで定義されています。

cp += mblen(cp, MB_CUR_MAX);
 

mbrlen() mblen() と同じ動作をしますが,シフト状態エンコーディングを含むロケールでもリスタート可能です。 [脚注 3]
mbrtowc() mbtowc() と同じ動作をしますが,シフト状態エンコーディングを含むロケールでもリスタート可能です。 [脚注 3]
mbsrtowcs() mbstowcs() と同じ動作をしますが,シフト状態エンコーディングを含むロケールでもリスタート可能です。 [脚注 3]
mbstowcs() マルチバイト文字列をワイド文字列に変換します。
mbtowc() マルチバイト文字をワイド文字に変換します。
wcstombs() ワイド文字列をマルチバイト文字列に変換します。
wcrtomb() wctomb() と同じ動作をしますが,シフト状態エンコーディングを含むロケールでもリスタート可能です。 [脚注 3]
wcsrtombs() wcstombs() と同じ動作をしますが,シフト状態エンコーディングを含むロケールでもリスタート可能です。 [脚注 3]
wctob() 可能であれば,ワイド文字をマルチバイト形式のシングルバイト文字に変換します。
wctomb() ワイド文字をマルチバイト文字に変換します。

注意

ファイル・コード (マルチバイト・データ) の明示的な変換処理が常に必要なわけではありません。 テキストの書き込みと読み込みを行う関数群 (A.7 節で説明) には書式指定 %S%C が含まれるため,マルチバイト文字からワイド文字への変換は自動的に処理されます。 古い ISO C の入出力関数 (A.10 節で説明) に対応する WPI 関数も,マルチバイト文字からワイド文字への変換を自動的に処理します。

A.10    入出力

次の表にリストされている WPI 関数は,テキストの入出力操作のために,ファイル・コード (一般にマルチバイト・エンコーディング) とプロセス・コード (ワイド文字エンコーディング) 間の変換を自動的に行います。

WPI 関数 ISO C の等価関数 説明
fgetwc() fgetc() 入力ストリームから文字を取得して,ワイド文字に変換します。
fgetws() fgets() 入力ストリームから文字列を取得して,ワイド文字列に変換します。
fputwc() fputc() ワイド文字をマルチバイト文字に変換し,結果を出力ストリームに書き込みます。
fputws() fputs() ワイド文字列をマルチバイト文字列に変換し,結果を出力ストリームに書き込みます。
fwide() なし ストリーム・オリエンテーションをバイトまたはワイド文字に設定します。 この関数を現在のロケール環境で使用しても無意味です。 [脚注 4]
getwc() getc() 引数として関数に渡される文字を入力ストリームから取得して,ワイド文字に変換します。
getwchar() getchar() 標準入力ストリームから文字を取得して,ワイド文字に変換します。
なし gets() fgetws() を参照してください。
mbsinit() なし シフト状態エンコーディングを使用するロケールで,マルチバイト文字列が初期変換状態であるかどうかを判別します。 [脚注 4]
putwc() putc() ワイド文字をマルチバイト文字に変換し,結果を出力ストリームに書き込みます。 変換された文字は,引数として関数に渡されます。
putwchar() getchar() ワイド文字をマルチバイト文字に変換し,結果を標準出力ストリームに書き込みます。
なし puts() fputws() を参照してください。
ungetwc() ungetc() ワイド文字を入力ストリーム上にプッシュバックします。

A.11    文字列処理

WPI ではワイド文字列の操作をサポートするために,ISO C 文字列処理関数の代替関数と新規の関数を規定しています。 WPI 関数は,シングルバイト文字とマルチバイト文字の両方をサポートします。

文字列の連結

WPI 関数 ISO C の等価関数 説明
wcscat() strcat() 文字列を他の文字列の終わりにコピーします。
wcsncat() strncat() コピーする文字数がパラメータ n によって制限される以外は,wcscat() と同じです。

文字列の検索

WPI 関数 ISO C の等価関数 説明
wcschr() strchr() ワイド文字列中で最初に現れるワイド文字を探します。
wcsrchr() strrchr() ワイド文字列中で最後に現れるワイド文字を探します。
wcspbrk() strpbrk() ある文字列に含まれる文字が,他方の文字列で最初に現れる位置を探します。
wcsstr() strstr() ワイド文字列中の部分文字列を探します。 wcsstr() は,Issue 5 以前の XSH 仕様で 規定されている wcswcs() に置き換わります。
wcscspn() strcspn() 1 番目のワイド文字列の中で,2 番目の ワイド文字列に含まれていない文字で構成する先頭部分の長さを返します。
wcsspn() strspn() 1 番目のワイド文字列の中で,2 番目の ワイド文字列に含まれる文字で構成する先頭部分の長さを返します。

文字列のコピー

WPI 関数 ISO C の等価関数 説明
wcscpy() strcpy() ワイド文字列をコピーします。
wcsncpy() strncpy() コピーするワイド文字の数がパラメータ n によって制限されること以外は,strcpy() 関数と同じです。

文字列の比較

WPI 関数 ISO C の等価関数 説明
wcscmp() strcmp() 2 つのワイド文字列を比較します。
wcsncmp() strncmp() 比較対象のワイド文字数がパラメータ n によって制限されること以外は,strcmp() 関数と同じです。

文字列長の判定

WPI 関数 ISO C の等価関数 説明
wcslen() strlen() ワイド文字列中の文字の数を判定します。

文字列の分割

WPI 関数 ISO C の等価関数 説明
wcstok() strtok() ワイド文字列をトークンの集合に分割します。 各トークンは,指定されたワイド文字で区切られます。

出力位置の判定

WPI 関数 ISO C の等価関数 説明
wcswidth() なし ワイド文字列中の文字を出力するのに必要なポジション数を判定します。
wcwidth() なし ワイド文字を出力するのに必要なポジション数を判定します。

ワイド文字列上でのメモリ操作

WPI 関数 ISO C の等価関数 説明
wmemcpy() memcpy() あるバッファから別のバッファにワイド文字をコピーします。
wmemchr() memchr() バッファ内で,指定されたワイド文字を探します。
wmemcmp() memcmp() 2 つのバッファ内で,指定された数のワイド文字を比較します。
wmemmove() memmove() 重なっている部分に悪影響を及ぼすことなく,あるバッファから他のバッファにワイド文字をコピーします。
wmemset() memset() 指定された数のワイド文字でバッファを埋めます。

A.12    コードセット変換

WPI にはコードセット変換機能が用意されています。 プログラム中で変換機能を利用するには関数を使用し,対話形式で利用するには iconv コマンドを使います。 プログラムやコマンド・レベルで,ソース・コードセットおよびターゲット・コードセットと,変換対象の言語テキスト・ファイルの名前を指定します。 コードセットは,言語テキストが渡される変換ストリームを定義します。

次の表に,コードセット変換に使用する関数の要約を示します。 これらの関数は,ライブラリ libiconv.a に含まれます。

WPI 関数 ISO C の等価関数 説明
iconv_open() なし ソース・コードセットとターゲット・コードセットを判定し,変換ストリームを初期化します。
iconv_close() なし 変換ストリームをクローズします。
iconv() なし ソース・コードセットでエンコードされた入力文字列を,ターゲット・コードセットでエンコードされた出力文字列に変換します。

iconv コマンドの説明と,サポートされている変換タイプについては,7.5 節を参照してください。 iconv ライブラリとプログラムの使用については, iconv(3) のリファレンス・ページを参照してください。