当前位置: C语言 -- 标准库 -- <uchar.h> -- mbstate_t

mbstate_t类型


描述:

该类型是一种完整对象类型;但不是数组类型。该类型可以保存多字节字符序列和宽字符序列之间相互转换所需的转换状态(conversion state)信息。

所有有效的多字节字符序列都应该开始并且终止于初始转换状态。初始转换状态可以使用值为0mbstate_t类型对象描述,实现中也可能使用其它值表示初始转换状态。任何LC_CTYPE类别设置中,值为0mbstate_t类型对象都可用于启动多字节字符序列的转换。


调用mbsinit函数可用于验证mbstate_t类型对象是否表示初始转换状态,例如:

mbsinit(ps); //ps是一个指向mbstate_t类型对象的指针。

如果函数返回非0值,ps指向的对象表示初始转换状态。


调用memset函数可将mbstate_t类型对象重置为初始转换状态,例如:

memset(ps, 0, sizeof(*ps)); //ps是一个指向mbstate_t类型对象的指针。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
/*类型mbstate_t范例*/

#include <locale.h>
#include <stdlib.h>
#include <uchar.h>
#include <wchar.h>

#define LENGTH 10

int main(void)
{
    setlocale(LC_CTYPE, "");
    
    static mbstate_t mbs;
    const char str[] = u8"\u4e3a\u4eba\u6c11\u670d\u52a1"; 
    char *strBegin = str;       //指向多字节字符序列首字节的指针。
    char16_t arr[LENGTH];         //存储转换得到的16位宽字符序列的数组。
    char16_t *arrBegin = arr;
    size_t number;              //存储mbrtoc16函数的返回值。

    /*多字节字符序列转换为16位宽字符序列。*/
    while((number = mbrtoc16(arrBegin, strBegin, MB_CUR_MAX, &mbs)))
    {
        if(number == (size_t)(-1))
        {
            wprintf(L"非法序列。\n");
            break;
        }
        else if(number == (size_t)(-2))
        {
            wprintf(L"不完整的多字节字符。\n");
            break;
        }
        else if(number == (size_t)(-3))
        {
            wprintf(L"字符已经存储。\n");
            ++arrBegin;
        }
        else
        {
            strBegin += number;
            ++arrBegin;
        }
    }

    if(mbsinit(&mbs))
        wprintf(L"初始转换状态。\n");
    
    return 0;
}


输出:

初始转换状态。

注:使用ideone编译。


相关内容:
mbsinit 检查初始转换状态的函数。