1.9.4 LC_CTYPE データブロック

LC_CTYPE データブロックによって文字体系と変換を設定します。

C ライブラリでロケールデータブロックを定義する場合、LC_CTYPE データブロックを定義するマクロは以下のようになります。
  1. シンボル名とロケール名を使用して LC_CTYPE_begin を呼び出します。
  2. LC_CTYPE_table を繰り返し呼び出して、256 個のテーブルエントリを指定します。LC_CTYPE_table は、引用符内に単一の引数を取ります。これは、テーブルエントリのコンマ区切りのリストである必要があります。各テーブルエントリでは、使用できる 256 個の文字それぞれが記述されています。その値は、不正な文字(IL)または以下の 1 つ以上のフラグのビット単位論理和です。
    __S
    ホワイトスペース文字
    __P
    句読文字
    __B
    印刷可能空白文字
    __L
    小文字
    __U
    大文字
    __N
    10 進数字
    __C
    制御文字
    __X
    16 進数字 A ~ F および a ~ f
    __A
    日本語のカタカナなど、大文字でも小文字でもない文字

    印刷可能空白文字は、isprint()isspace() の両方の結果が True となる任意の文字として定義されます。
    __A は、__N または __X のいずれかと同じ文字に対して指定できません。
  3. 必要に応じて、以下のオプションのマクロのいずれか、または両方を呼び出します。
    • LC_CTYPE_full_wctype。このマクロを引数なしで呼び出すと、C99 ワイドキャラクタ ctype 関数(iswalpha()、iswupper() など)によって、この LC_CTYPE ロケールがアクティブなときに Unicode の完全な範囲全体に有用な値が返されます。このマクロが指定されていない場合には、ワイド ctype 関数は最初の 256 個の wchar_t 値を 256 個の char 値と同様に扱います。wchar_t 範囲の 257 番目から最後までの値は、不正文字を含んでいるものとして処理されます。
    • LC_CTYPE_multibyte。このロケールをマルチバイト文字セットにするように定義します。このマクロは、3 つの引数を指定して呼び出します。最初の 2 つの引数は、マルチバイト文字セットと Unicode ワイドキャラクタの間で変換を実行する関数の名前です。最後の引数は、対応する文字セットの C マクロ MB_CUR_MAX によって取られる値である必要があります。この 2 つの関数引数には、以下のプロトタイプがあります。
      size_t internal_mbrtowc(wchar_t *pwc, char c, mbstate_t *pstate); size_t internal_wcrtomb(char *s, wchar_t w, mbstate_t *pstate);
      
      internal_mbrtowc()
      1 バイトの c を入力として取り、このバイトの読み出しの結果として pstate によってポイントされている mbstate_t を更新します。このバイトがマルチバイト文字のエンコーディングを完了するバイトである場合、pwc によってポイントされている場所に該当するワイドキャラクタを書き込み、1 を返してこの動作が実行されたことを示します。このバイトでマルチバイトのエンコーディングが完了しない場合には、この関数は -2 を返して mbstate_t の状態変化を示すと共に文字の出力がなかったことを示します。これ以外の場合には、-1 を返してエンコードされた入力が無効であることを示します。
      internal_wcrtomb()
      入力として 1 ワイドキャラクタ w を取り、s によってポイントされているメモリ内に数バイトの書き込みを行います。この関数は、出力されたバイト数を返すか、-1 を返して入力された文字がマルチバイト文字セットの表現として適切ではないことを示します。
  4. 引数なしで LC_CTYPE_end を呼び出し、ロケールブロックの定義を終了します。

例:LC_CTYPE データブロック

        LC_CTYPE_begin utf8_ctype, "UTF-8"         ;         ; UTF-8 の下位半分内のシングルバイト文字は完全に、         ; 通常の "C" ロケール内の場合と同じ。LC_CTYPE_table "__C, __C, __C, __C, __C, __C, __C, __C, __C" ; 0x00-0x08         LC_CTYPE_table "__C|__S, __C|__S, __C|__S, __C|__S, __C|__S"                                                          ; 0x09-0x0D(BS,LF,VT,FF,CR)         LC_CTYPE_table "__C, __C, __C, __C, __C, __C, __C, __C, __C" ; 0x0E-0x16         LC_CTYPE_table "__C, __C, __C, __C, __C, __C, __C, __C, __C" ; 0x17-0x1F         LC_CTYPE_table "__B|__S" ; space         LC_CTYPE_table "__P, __P, __P, __P, __P, __P, __P, __P" ; !"#$%&'(         LC_CTYPE_table "__P, __P, __P, __P, __P, __P, __P" ; )*+,-./         LC_CTYPE_table "__N, __N, __N, __N, __N, __N, __N, __N, __N, __N" ; 0-9         LC_CTYPE_table "__P, __P, __P, __P, __P, __P, __P" ; :;<=>?@         LC_CTYPE_table "__U|__X, __U|__X, __U|__X, __U|__X, __U|__X, __U|__X" ; A-F         LC_CTYPE_table "__U, __U, __U, __U, __U, __U, __U, __U, __U, __U" ; G-P         LC_CTYPE_table "__U, __U, __U, __U, __U, __U, __U, __U, __U, __U" ; Q-Z         LC_CTYPE_table "__P, __P, __P, __P, __P, __P" ; [\]^_`         LC_CTYPE_table "__L|__X, __L|__X, __L|__X, __L|__X, __L|__X, __L|__X" ; a-f         LC_CTYPE_table "__L, __L, __L, __L, __L, __L, __L, __L, __L, __L" ; g-p         LC_CTYPE_table "__L, __L, __L, __L, __L, __L, __L, __L, __L, __L" ; q-z         LC_CTYPE_table "__P, __P, __P, __P" ; {|}~         LC_CTYPE_table "__C" ; 0x7F         ;         ; UTF-8 の上位半分内にシングルバイト文字として         ; 有効なものがないため、すべてが不正文字(IL)。LC_CTYPE_table "IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL"         LC_CTYPE_table "IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL"         LC_CTYPE_table "IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL"         LC_CTYPE_table "IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL"         LC_CTYPE_table "IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL"         LC_CTYPE_table "IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL"         LC_CTYPE_table "IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL"         LC_CTYPE_table "IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL,IL"         ;         ; UTF-8 ctype ロケールは完全バージョンの wctype が必要。LC_CTYPE_full_wctype         ;         ; UTF-8 はマルチバイトロケールなので、         ; 変換関数の指定が必要。UTF-8 に対して MB_CUR_MAX は 6(先頭バイト         ; 0xFC および 0xFD の後にはそれぞれ 5 つの後続         ; バイト)。;         ; 変換関数の実装は、         ; この例では提供されない。;         IMPORT  utf8_mbrtowc         IMPORT  utf8_wcrtomb         LC_CTYPE_multibyte utf8_mbrtowc, utf8_wcrtomb, 6         LC_CTYPE_end
関連する参考文書
1.9.3 C ライブラリのロケールデータブロックの定義
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.