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

mbrlen函数


概要:
#include <wchar.h>
size_t mbrlen(const char * restrict s,
      size_t n,
      mbstate_t * restrict ps);

描述:

该函数可用于确定多字节字符的字节数。

该函数等价于:

mbrtowc(NULL, s, n, ps != NULL ? ps : &internal)

其中internalmbrlen函数的内部mbstate_t对象;区别在于参数ps指定的表达式只被评估一次。


mblen函数不同,mbrlen函数存在一个额外参数ps,参数ps指向对象完整地描述了关联多字节字符序列的当前转换状态。如果参数ps是空指针,函数会使用内部mbstate_t对象,该对象在程序启动时初始化为初始转换状态;这种情况下,mbrlen函数不要求避免与其它mbrlen函数调用发生数据竞争。实现应像没有库函数使用ps空指针调用mbrlen函数一样。mbrlen函数的返回值不表示编码是否依赖于状态。


参数:
const char * restrict s

指向多字节字符第一个字节的指针。

size_t n

最多检查的字节数。宏MB_CUR_MAX定义了当前语言环境下多字节字符的最大字节数。

mbstate_t * restrict ps

指向mbstate_t类型对象的指针,指向对象记录关联多字节字符序列的当前转换状态。


返回值:

如果接下来的n个字节或者更少字节构成的多字节字符对应的宽字符是空宽字符,函数返回0

如果接下来的n个字节或者更少字节构成有效的多字节字符,函数返回多字节字符的字节数,其值域区间为[1,n]

如果接下来的n个字节构成不完整的多字节字符(但可能是有效的。),并且所有n个字节都已经被处理(没有值被存储。),函数返回(size_t)(-2)

:当参数n值至少为MB_CUR_MAX时,这种情况只有在参数s指向冗余移位序列(redundant shift sequences)时才会发生(用于依赖状态编码的实现。)。

如果接下来的n个字节或者更少字节不能构成完整且有效的多字节字符(没有值被存储。),将发生编码错误;宏EILSEQ存入errno,并且转换状态是不明确的,函数返回(size_t)(-1)


范例:
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 
/*函数mbrlen范例*/

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

void testReturnValue(size_t number)
{
    if(number == (size_t)(-2))
        wprintf(L"(size_t)(-2)\n");
    else if(number == (size_t)(-1))
        wprintf(L"(size_t)(-1)\n");
    else
        wprintf(L"%zu\n", number);
}

int main(void)
{
    setlocale(LC_ALL, "");
    
    char str[] = "";
    static mbstate_t mbs;
    size_t length;

    length = mbrlen(str, MB_CUR_MAX, &mbs);
    testReturnValue(length);
    
    return 0;
}


输出:

3

:使用ideone.com编译;如果使用Visual Studio编译,将输出2;差异是由于编码方式不同造成的。ideone.com使用UTF-8编码,一个汉字需要使用3个字节表示;Visual Studio使用CP936,一个汉字需要使用2个字节表示。


相关内容:
mbrtowc 将多字节字符序列转换为宽字符的函数。
wcrtomb 将宽字符转换为多字节字符序列的函数。