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)
其中internal是mbrlen函数的内部mbstate_t对象;区别在于参数ps指定的表达式只被评估一次。
与mblen函数不同,mbrlen函数存在一个额外参数ps,参数ps指向对象完整地描述了关联多字节字符序列的当前转换状态。如果参数ps是空指针,函数会使用内部mbstate_t对象,该对象在程序启动时初始化为初始转换状态;这种情况下,mbrlen函数不要求避免与其它mbrlen函数调用发生数据竞争。实现应像没有库函数使用ps空指针调用mbrlen函数一样。mbrlen函数的返回值不表示编码是否依赖于状态。
参数:
指向多字节字符第一个字节的指针。
最多检查的字节数。宏MB_CUR_MAX定义了当前语言环境下多字节字符的最大字节数。
指向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)。
范例:
|
|
输出:
3
注:使用ideone.com编译;如果使用Visual Studio编译,将输出2;差异是由于编码方式不同造成的。ideone.com使用UTF-8编码,一个汉字需要使用3个字节表示;Visual Studio使用CP936,一个汉字需要使用2个字节表示。
相关内容:
mbrtowc | 将多字节字符序列转换为宽字符的函数。 |
wcrtomb | 将宽字符转换为多字节字符序列的函数。 |