当前位置: C语言 -- 标准库 -- <wchar.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 
/*类型mbstate_t范例*/

#include <locale.h>
#include <string.h>
#include <wchar.h>

/*声明测试转换状态的函数。*/
void testState(mbstate_t *ps);

int main(void)
{
    setlocale(LC_ALL, "");

    const char str[] = u8"\u5bb6";
    static mbstate_t mbs;
    size_t number = strlen(str);
    
    wprintf(L"%s占有%zu个字节。\n", str, number);
    
    for(size_t i=0; i<number; ++i)
    {
        mbrlen(&str[i], 1, &mbs);
        wprintf(L"读取第%zu个字节后,", (i+1));
        testState(&mbs);
    }
    
    return 0;
}

/*定义测试转换状态的函数。*/
void testState(mbstate_t *ps)
{
    if(ps == NULL)
        wprintf(L"空指针。\n");
    else
    {
        if(mbsinit(ps))
            wprintf(L"转换状态是初始转换状态。\n");
        else
            wprintf(L"转换状态不是初始转换状态。\n");
    }
}


输出:

家占有3个字节。

读取第1个字节后,转换状态不是初始转换状态。

读取第2个字节后,转换状态不是初始转换状态。

读取第3个字节后,转换状态是初始转换状态。

注:使用ideone编译。


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