Go to main content
Oracle Solaris でのアプリケーションの国際化とローカライズ

印刷ビューの終了

更新: 2016 年 11 月
 
 

文字および文字列の処理

文字および文字列の処理に使用する文字コードは、2 つのグループに分類できます。

マルチバイト (ファイルコード)

ファイルコードは、テキストデータの交換とファイルへの格納に使用されます。基盤のシステムに関係なく、ビッグエンディアンという固定のバイトオーダーが使用されています。UTF-8EUC、シングルバイトコードセット、BIG5Shift-JISPCKGBKGB18030 などのコードセットがこのカテゴリに含まれます。このセクションで関数を説明する文脈では、現在のロケールのコードセットがシングルバイトコードセットの場合でも、マルチバイト文字という用語がこのコードセットを指す一般的な用語になります。

ワイド文字 (プロセスコード)

プロセスコードは内部処理に使用される文字の固定幅の表現です。ここではプラットフォームのネイティブのバイトオーダーが使用されており、ビッグエンディアンまたはリトルエンディアンの場合があります。UTF-32UCS-2UCS-4 などのエンコーディングはワイド文字のエンコーディングになることがあります。

マルチバイトデータとワイド文字データ間の変換が必要になることはよくあります。プログラムがファイルから入力を取得すると、fscanf()fwscanf() などの入力関数を使用するか、入力後に mbtowc()mbsrtowcs() などの変換関数を使用して、ファイル内のマルチバイトデータがワイド文字のプロセスコードに変換されます。ワイド文字形式からマルチバイト文字形式に出力データを変換するには、fwprintf()fprintf() などの出力関数を使用するか、出力前に wctomb()wcsrtombs() などの変換関数を適用します。

次の各セクションでは、文字、ワイド文字、対応するデータ型を処理するための関数について説明します。

文字のタイプと定義

ISO/IEC 9899 標準は、「ワイド文字」という用語と、wchar_t および wint_t のデータ型を定義しています。

  • ワイド文字は、wchar_t 型のオブジェクトに適合する 1 文字の表現です。

  • wchar_t は、サポートされるすべてのロケールのすべての文字を表すことができる整数型です。

  • wint_t は、wchar_t または WEOF の任意の有効な値を格納できる整数型です。

  • ワイド文字文字列 (ワイド文字列またはプロセスコード文字列も同じ) は、末尾が Null ワイド文字コードであるワイド文字のシーケンスです。


注 -  ISO/IEC 9899 標準では、wchar_t データ型のコンテンツの形式やエンコーディングは指定されていません。これは実装固有のデータ型であり、移植可能ではないからです。多くの実装では wchar_t データ型のコンテンツに対して何らかの Unicode エンコード形式が使用されていますが、wchar_t のコンテンツが Unicode だと想定することはできません。一部のプラットフォームでは、ワイド文字のエンコーディングに UCS-4 または UCS-2 を使用しています。

Oracle Solaris では、wchar_t の内部形式はロケール固有です。Oracle Solaris の Unicode ロケールでは、wchar_tUTF-32 Unicode エンコード形式を使用し、その他のロケールは別の表現を使用します。

詳細は、stddef.h(3HEAD) および wchar.h(3HEAD) のマニュアルページを参照してください。

整数コード文字分類関数

次の関数は文字分類に使用され、true の場合はゼロ以外の値を返し、false の場合は 0 を返します。isascii() 関数以外のすべての関数は、ロケールに依存します。特に、現在のロケールが LC_CTYPE カテゴリの場合はこれに該当します。

isalpha()

英字をテストします

isalnum()

英数字をテストします

isascii()

7 ビットの US-ASCII 文字をテストします

isblank()

空白文字をテストします

iscntrl()

制御文字をテストします

isdigit()

10 進数をテストします

isgraph()

表示可能文字をテストします

islower()

小文字をテストします

isprint()

出力可能文字をテストします

ispunct()

句読点文字をテストします

isspace()

ホワイトスペース文字をテストします

isupper()

大文字をテストします

isxdigit()

16 進数をテストします

これらの関数は UTF-8 などのマルチバイトコードセットのロケールでは使用しないでください。マルチバイトコードセットには、次のセクションで説明するワード文字分類関数を使用します。

これらの関数の一部の動作は、コンパイル時に使用されたコンパイラオプションによっても異なります。isalpha()isgraph()isprint()isxdigit() 関数の「デフォルト」および標準準拠の動作については、ctype(3C) のマニュアルページを参照してください。たとえば、isalpha() 関数は次のように定義されています。

デフォルト isalpha()

任意の文字の isupper() または islower() が true であることをテストします。

標準準拠 isalpha()

任意の文字の isupper() または islower() が true であること、または現在のロケール定義の文字セットの 1 つである任意の文字の iscntrl()isdigit()ispunct()、または isspace() のどれも true でないことをテストします。C ロケールでは、isalpha() は、isupper() または islower() が true である文字に対してのみ true を返します。

ここには、アラビア語、ヘブライ語、タイ語など、大文字と小文字の区別がない (unicase とも呼ばれる) 言語またはアルファベットから生じる問題があります。ヘブライ語の従来のロケール he_IL.ISO8859-8 の aleph (0xE0) などのアルファベット文字の場合、関数 isupper() および islower() は常に false を返します。したがって、isalpha() 関数も常に false を返すことになります。コンパイラオプションが標準準拠の動作に対応している場合、isalpha() 関数はこうした文字に対して true を返します。詳細は、isalpha(3C) および standards(5) のマニュアルページを参照してください。

Oracle Solaris Studio 12.4: C ユーザーガイド』と、ctype(3C) および SUSv3(5) のマニュアルページも参照してください。

ワイド文字分類関数

次の関数はワイド文字の分類に使用され、TRUE の場合はゼロ以外の値を返し、FALSE の場合は 0 を返します。これらの関数は、現在のロケールの LC_CTYPE カテゴリで定義されている、alphalower、または jkana などの指定された文字クラスに対して、指定されたワイド文字をチェックします。つまりこれらの関数は、ロケールに依存します。

iswalpha()

英字のワイド文字をテストします

iswalnum()

英数字のワイド文字をテストします

iswascii()

ワイド文字が 7 ビットの US-ASCII 文字を表すかどうかをテストします

iswblank()

空白のワイド文字をテストします

iswcntrl()

制御ワイド文字をテストします

iswdigit()

10 進数のワイド文字をテストします

iswgraph()

表示可能なワイド文字をテストします

iswlower()

小文字のワイド文字をテストします

iswprint()

出力可能なワイド文字をテストします

iswpunct()

句読点ワイド文字をテストします

iswspace()

ホワイトスペースのワイド文字をテストします

iswupper()

大文字のワイド文字をテストします

iswxdigit()

16 進数のワイド文字をテストします

isenglish()

英語の文字を表すワイド文字をテストします (US-ASCII 文字を除く)

isideogram()

表意文字を表すワイド文字をテストします (US-ASCII 文字を除く)

isnumber()

数字 (ディジット) を表すワイド文字をテストします (US-ASCII 文字を除く)

isphonogram()

音声文字を表すワイド文字をテストします (US-ASCII 文字を除く)

isspecial()

特殊文字を表すワイド文字をテストします (US-ASCII 文字を除く)

次の文字クラス名は、すべてのロケールで定義されています。

  • alnum

  • alpha

  • blank

  • cntrl

  • digit

  • graph

  • lower

  • print

  • punct

  • space

  • upper

  • xdigit

isenglish()isideogram()isnumber()isphonogram()isspecial() は、従来の Oracle Solaris 固有のワイド文字分類関数です。これらの関数の文字クラスは、ko_KR.EUCzh_CN.EUCzh_CN.GBKzh_CN.GB18030zh_HK.BIG5HKzh_TW.BIG5zh_TW.EUC のアジア語ロケールとこれらのバリアントのみで定義されています。Unicode ロケールを含むその他のロケールで使用した場合、戻り値は常に false になります。

次の関数を使用すると、汎用的な方法で特定の文字クラスを問い合わせることができます。

wctype()

文字クラスを定義します

iswctype()

指定されたクラスの文字をテストします

使用例 11  ワイド文字の文字クラスの問い合わせ

次の例では、iswctype() および wctype() 関数の呼び出しを使用して、指定された Unicode 文字が jhira 文字クラスに属しているかどうかチェックします。jhira 文字クラスは日本語ひらがな文字でできています。

  wint_t  wc;
  int     ret;

  setlocale(LC_ALL, "ja_JP.UTF-8");

  /* "\xe3\x81\xba" is UTF-8 for HIRAGANA LETTER PE */
  ret = mbtowc(&wc, "\xe3\x81\xba", 3);
  if (ret == (size_t)-1) {
          /* Invalid character sequence. */
          :
  }

  if (iswctype(wc, wctype("jhira"))) {
          wprintf(L"'%c' is a hiragana character.\n", wc);
  }

この例では次の出力が作成されます。

ぺ is a hiragana character.

文字変換関数

次の関数は、文字クラス間での文字のマッピング (文字変換) に使用されます。文字のマッピングが現在のロケールの文字クラスで行われた場合、関数は文字変換された文字を返します。これらの関数は、ロケールに依存します。

tolower()

大文字を小文字に変換します

toupper()

小文字を大文字に変換します

towlower()

大文字のワイド文字を小文字に変換します

towupper()

小文字のワイド文字を大文字に変換します

次の関数は、文字変換を実行するための汎用的な方法を提供します。

wctrans()

文字マッピングを定義します

towctrans()

ワイド文字のマッピング

Unicode 文字列に関連する関数の詳細は、UTF-8 文字列の処理を参照してください。

使用例 12  ワイド文字の文字変換

次のコード抜粋部分は、towupper() 関数を使用して Unicode ワイド文字を大文字に変換する方法を示しています。

  wint_t  wc;
  int     ret;

  setlocale(LC_ALL, "cs_CZ.UTF-8");

  /* "\xc5\x99" is UTF-8 for LATIN SMALL LETTER R WITH CARON */
  ret = mbtowc(&wc, "\xc5\x99", 2);
  if (ret == (size_t)-1) {
          /* Invalid character sequence. */
          :
  }

  wprintf(L"'%c' is uppercase of '%c'.\n", towupper(wc), wc);

この例では次の出力が作成されます。

Ř is uppercase of ř.

文字列の照合

次の関数は、現在のロケールの照合データに基づいて文字列を比較するために使用されます。

strcoll()

照合情報を使用した文字列比較

strxfrm()

文字列変換

wcscoll(), wscoll()

照合情報を使用したワイド文字文字列の比較

wcsxfrm(), wsxfrm()

ワイド文字文字列の変換

文字列の大規模なリストを並べ替える場合のパフォーマンスを向上させるには、strcoll() 関数の代わりに strxfrm() および strcmp() 関数を、wcscoll() 関数の代わりに wcsxfrm() および wcscmp() 関数を使用します。

strxfrm() および wcsxfrm() 関数を使用した場合、変換後の文字列の形式は人間が読める形式ではありません。これらの関数は、それぞれ strcmp() および wcscmp() 関数の呼び出しへの入力として使用されます。

詳細は、strcmp(3C) および wcscmp(3C) のマニュアルページを参照してください。

マルチバイト文字とワイド文字間の変換

次の関数は、現在のロケールのコードセット (マルチバイト) とプロセスコード (ワイド文字表現) の間の変換に使用されます。

これらの関数はロケールに依存しており、現在のロケールの LC_CTYPE カテゴリによって異なります。不完全な文字と無効な文字では、同じエラーを返します。無効な文字と不完全な文字の詳細は、コードセットの変換を参照してください。

mblen()

1 文字のバイト数を取得します

mbtowc()

文字をワイド文字コードに変換します

mbstowcs()

文字列をワイド文字文字列に変換します

wctomb()

ワイド文字コードを文字に変換します

wcstombs()

ワイド文字文字列を文字列に変換します

次の関数は再起動可能で、不完全な文字がある場合の処理に使用されます。こうしたケースは、以前の呼び出しで不完全な文字がレポートされていながら、現在の呼び出しの追加バイトが有効な文字である場合に発生します。 この種の処理に必要な状態の情報を保存するために、関数は mbstate_t 型のユーザー指定または内部の状態構造を使用します。mbsinit() 関数を使用して、mbstate_t 構造が初期状態かどうかを検出します。

mbsinit()

変換オブジェクトのステータスを決定します

mbrlen()

1 文字のバイト数を取得します (再起動可能)

mbrtowc()

文字をワイド文字コードに変換します (再起動可能)

mbsrtowcs()

文字列をワイド文字文字列に変換します (再起動可能)

wcrtomb()

ワイド文字コードを文字に変換します (再起動可能)

wcsrtombs()

ワイド文字文字列を文字列に変換します (再起動可能)

次の関数は、現在のロケールのコードセットとプロセスコードの間の変換に使用されます。これらは、整数コード化された文字がシングルバイトで表されるかどうかを決定します。そうでない場合、それぞれ EOF と WEOF を返します。

wctob()

可能な場合、ワイド文字をシングルバイト文字に変換します。

btowc()

可能な場合、シングルバイト文字をワイド文字に変換します。

ワイド文字文字列

次の関数は、ワイド文字文字列を処理するために使用されます。

wcslen(), wslen(), wcsnlen()

固定サイズのワイド文字文字列の長さを取得します

wcschr(), wschr()

ワイド文字文字列内で最初に出現するワイド文字を検索します

wcsrchr(), wsrchr()

ワイド文字文字列内で最後に出現するワイド文字を検索します

wcspbrk()

ワイド文字文字列のワイド文字コードをスキャンします

wcscat(), wscat(), wcsncat()

2 つのワイド文字文字列を連結します

wcscmp(), wscmp(), wcsncmp()

2 つのワイド文字文字列を比較します

wcscpy(), wscpy()

ワイド文字文字列をコピーします

wcsncpy(), wsncpy()

ワイド文字文字列を部分コピーします

wcpcpy(), wcpncpy()

ワイド文字文字列コピーして、ポインタを末尾に返します

wcsspn(), wsspn()

ワイド文字サブストリングの長さを取得します

wcscspn(), wscspn

補完ワイド文字サブストリングの長さを取得します

wcstok(), wstok()

ワイド文字文字列をトークンに分割します

wcsstr(), wscwcs()

ワイド文字サブストリングを検索します

wcwidth(), wcswidth(), wscol()

ワイド文字またはワイド文字文字列の、列の位置番号を取得します

wscasecmp(), wsncasecmp()

ワイド文字文字列を、大文字小文字を区別せずに比較します

wcsdup(), wsdup()

ワイド文字文字列を複製します

wcswcs() 関数はレガシーにマーク付けされており、将来的には ISO/IEC 9899 標準から削除される可能性があります。代わりに wcsstr() 関数を使用します。

ワイド文字を数値に変換する関数は次のとおりです。

wcstol(), wstol(), wcstoll(), watol(), watoll(), watoi()

ワイド文字文字列を long 整数に変換します

wcstoul(),wcstoull()

ワイド文字文字列を符号なし long 整数に変換します

wcstod(),wstod(), wcstof(), wcstold(), watof()

ワイド文字文字列を浮動小数点型に変換します

次の関数は、ワイド文字に対するメモリー内の操作をリストします。これらは、memset()memcpy() などの関数のワイド文字列版です。これらの関数はロケールの影響は受けず、すべての wchar_t 値が同一に扱われます。

wmemset()

メモリー内でワイド文字を設定します

wmemcpy()

メモリー内でワイド文字をコピーします

wmemmove()

メモリー内で領域を重複させてワイド文字をコピーします

wmemcmp(3C)

メモリー内でワイド文字を比較します

wmemchr(3C)

メモリー内でワイド文字を検索します

ワイド文字の入力と出力

次の関数は、ワイド文字の入力および出力に使用されます。これらの関数は、ファイルコード (マルチバイトデータ) と内部プロセスコード (ワイド文字データ) の間の暗黙的な変換を実行します。

fgetwc(), getwc()

ストリームからワイド文字コードを取得します

getwchar()

標準入力ストリームからワイド文字を取得します

fgetws()

ストリームからワイド文字文字列を取得します

getws() (*)

標準入力ストリームからワイド文字文字列を取得します

fputwc(), putwc()

ワイド文字コードをストリームに配置します

putwchar()

ワイド文字コードを標準出力ストリームに配置します

fputws()

ワイド文字文字列をストリームに配置します

putws() (*)

ワイド文字文字列を標準出力ストリームに配置します

fwide()

ストリームの方向をバイトまたはワイド文字に設定します

ungetwc()

ワイド文字コードを入力ストリームにプッシュバックします

次の関数は、ワイド文字の入力および出力の書式設定に使用されます。

fwprintf(), wprintf(), swprintf(), wsprintf() (*)

書式設定されたワイド文字出力を印刷します

vfwprintf(), vwprintf(), vswprintf()

stdarg 引数リストをワイド文字に書式設定して出力します

fwscanf(), wscanf(), swscanf(), wsscanf() (*)

書式設定されたワイド文字入力を変換します

vfwscanf(), vwscanf(), vswscanf()

stdarg 引数リストを使用して、書式設定されたワイド文字入力を変換します

(*) のマークが付いた関数は、Multibyte Support Extension (MSE) を導入した UNIX 98 標準より前に Oracle Solaris に追加されたものです。これらには、デフォルトの wchar.h の代わりに、widec.h ヘッダーを含める必要があります。