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

    十进制数字

    __C

    控制字符

    __X

    十六进制数字字母 A-F 和 a-f

    __A

    字母,但不分大小写,如日文片假名。

    Note

    可打印的空白字符被定义为 isprint()isspace() 结果均为真的任何字符。

    不能为与 __N__X 相同的字符指定 __A

    有关详细信息,请参阅指定数据

  3. 如果需要,可以调用以下一个或两个可选宏:

    • LC_CTYPE_full_wctype,当此 LC_CTYPE 区域设置处于活动状态时,如果不使用参数调用该宏,则会导致 C99 宽字符 ctype 函数(iswalphaiswupper 等)在整个 Unicode 范围内返回有用的值。 如果未指定该宏,宽 ctype 函数则会简单地将前 256 个 wchar_t 值视为与 256 个 char 值相同,而将 wchar_t 范围内的其余值视为包含非法字符。

    • LC_CTYPE_multibyte 将该区域设置定义为多字节字符集。 应使用三个参数调用该宏。 前两个参数是在多字节字符集和 Unicode 宽字符之间执行转换的函数的名称。 最后一个自变量是 C 宏 MB_CUR_MAX 必须为相应字符集指定的值。 这两个函数参数具有以下原型:

      
      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()

      将一个宽字符 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 0349AC
Non-Confidential