2.7.4. LC_CTYPE データブロック

LC_CTYPE データブロックを定義するマクロは、以下のとおりです。

  1. シンボル名とロケール名を使用して LC_CTYPE_begin を呼び出します。 詳細については、開始位置の指定を参照して下さい。

  2. LC_CTYPE_table を繰り返し呼び出して、256 個のテーブルエントリを指定します。LC_CTYPE_table は、引用符内に単一の引数をとります。 これは、テーブルエントリのコンマ区切りのリストである必要があります。 各テーブルエントリでは、使用できる 256 個の文字それぞれが記述されています。その値は、不正な文字(IL)または以下のフラグを組み合わせた合計値です。

    __S

    空白文字

    __P

    句読文字

    __B

    印刷可能空白文字

    __L

    小文字

    __U

    大文字

    __N

    10 進数字

    __C

    制御文字

    __X

    16 進数字 A 〜 F および a 〜 f

    __A

    日本語のカタカナなど、大文字でも小文字でもない文字

    Note

    印刷可能空白文字は、isprint()isspace() の両方の結果が True となる任意の文字として定義されます。

    __A は、__N または __X のいずれかと同じ文字に対して指定できません。

    詳細については、データの指定を参照して下さい。

  3. 必要に応じて、以下のオプションのマクロのいずれか、または両方を呼び出します。

    • LC_CTYPE_full_wctype マクロを引数なしで呼び出すと、C99 ワイドキャラクタ ctype 関数(iswalphaiswupper など)によって、この LC_CTYPE ロケールがアクティブなときにユニコードの完全な範囲全体に有用な値が返されます。 このマクロが指定されていない場合には、ワイド ctype 関数は、単純に、最初の 256 個の wchar_t 値を 256 個の char 値と同様に扱います。wchar_t 範囲の 257 番目から最後までの値は、不正文字を含んでいるものとして処理されます。

    • LC_CTYPE_multibyte は、このロケールをマルチバイト文字セットにするように定義します。 このマクロは、3 つの引数を指定して呼び出します。 最初の 2 つの引数は、マルチバイト文字セットとユニコードワイドキャラクタの間で変換を実行する関数の名前です。 最後の引数は、対応する文字セットの 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 を呼び出し、ロケールブロックの定義を終了します。 詳細については、終了位置の指定を参照して下さい。

Example 2.4 に、LC_CTYPE データブロックを示します。

Example 2.4.  CTYPE ロケールの定義

    LC_CTYPE_begin utf8_ctype, "UTF-8"
    ;
    ; Single-byte characters in the low half of UTF-8 are exactly
    ; the same as in the normal "C" locale.
    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
    ;
    ; Nothing in the top half of UTF-8 is valid on its own as a
    ; single-byte character, so they are all illegal characters (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"
    ;
    ; The UTF-8 ctype locale wants the full version of wctype.
    LC_CTYPE_full_wctype
    ;
    ; UTF-8 is a multi-byte locale, so we must specify some
    ; conversion functions. MB_CUR_MAX is 6 for UTF-8 (the lead
    ; bytes 0xFC and 0xFD are each followed by five continuation
    ; bytes).
    ;
    ; The implementations of the conversion functions are not
    ; provided in this example.
    ;
    IMPORT  utf8_mbrtowc
    IMPORT  utf8_wcrtomb
    LC_CTYPE_multibyte utf8_mbrtowc, utf8_wcrtomb, 6
    LC_CTYPE_end
Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0349AJ
Non-Confidential