mbrlen ()- 确定多字节字符的长度 (可重新启动)
格式
#include <wchar.h>
size_t mbrlen (const char *s, size_t n, mbstate_t *ps);语言级别
ANSI
线程安全
是,如果 ps 不为 NULL。
语言环境敏感
此函数的行为可能受当前语言环境的 LC_CTYPE 类别影响。 如果在编译命令上指定了 LOCALETYPE (*LOCALEUCS2) 或 LOCALETYPE (*LOCALEUTF) ,那么此函数也可能受当前语言环境的 LC_UNI_CTYPE 类别影响。 当在编译命令上指定 LOCALETYPE (*CLD) 时,此功能不可用。 有关更多信息,请参阅 了解 CCSID 和语言环境。
描述
此函数是 mblen()的可重新启动版本。
mbrlen() 函数确定多字节字符的长度。
n 是要检查的多字节字符串的字节数 (最多)。
此函数与其对应的内部状态多字节字符函数不同,因为它有一个额外的参数,即指向 mbstate_t 的类型指针的 ps ,它指向一个可以完全描述关联多字节字符序列的当前转换状态的对象。 如果 ps 是 NULL 指针,那么 mbrlen() 的行为类似于 mblen()。
mbrlen() 是 mblen()的可重新启动版本。 换言之,轮班状态信息作为其中一个自变量 (ps 表示初始轮班) 传递,并在退出时更新。 通过 mbrlen(),您可以从一个多字节字符串切换到另一个多字节字符串,前提是您已保留 shift-state 信息。
返回值
如果 s 是空指针,并且活动语言环境允许混合字节字符串,那么 mbrlen() 函数将返回非零值。 如果 s 是空指针,并且活动语言环境不允许混合字节字符串,那么将返回零。
如果 s 不是空指针,那么 mbrlen() 函数将返回下列其中一项:
- 0
- 如果 s 是 NULL 字符串 (s 指向 NULL 字符)。
- 正
- 如果下一个 n 个或更少的字节包含有效的多字节字符。 返回的值是组成多字节字符的字节数。
- (size_t) -1
- 如果 s 未指向有效的多字节字符。
- (size_t) -2
- 如果下一个 n 个或更少的字节导致字符不完整但可能有效,并且已处理所有 n 个字节
示例
/* This program is compiled with LOCALETYPE(*LOCALE) and */
/* SYSIFCOPT(*IFSIO) */
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
#include <errno.h>
#define LOCNAME "/qsys.lib/JA_JP.locale"
#define LOCNAME_EN "/qsys.lib/EN_US.locale"
int main(void)
{
int length, sl = 0;
char string[10];
mbstate_t ps = 0;
memset(string, '\0', 10);
string[0] = 0xC1;
string[1] = 0x0E;
string[2] = 0x41;
string[3] = 0x71;
string[4] = 0x41;
string[5] = 0x72;
string[6] = 0x0F;
string[7] = 0xC2;
/* In this first example we will find the length of */
/* of a multibyte character when the CCSID of locale */
/* associated with LC_CTYPE is 37. */
/* For single byte cases the state will always */
/* remain in the initial state 0 */
if (setlocale(LC_ALL, LOCNAME_EN) == NULL)
printf("setlocale failed.\n");
length = mbrlen(string, MB_CUR_MAX, &ps);
/* In this case length is 1, which is always the case for */
/* single byte CCSID */
printf("length = %d, state = %d\n\n", length, ps);
printf("MB_CUR_MAX: %d\n\n", MB_CUR_MAX);
/* Now let's try a multibyte example. We first must set the */
/* locale to a multibyte locale. We choose a locale with */
/* CCSID 5026 */
if (setlocale(LC_ALL, LOCNAME) == NULL)
printf("setlocale failed.\n");
length = mbrlen(string, MB_CUR_MAX, &ps);
/* The first is single byte so length is 1 and */
/* the state is still the initial state 0 */
printf("length = %d, state = %d\n\n", length, ps);
printf("MB_CUR_MAX: %d\n\n", MB_CUR_MAX);
sl += length;
length = mbrlen(&string[sl], MB_CUR_MAX, &ps);
/* The next character is a mixed byte. Length is 3 to */
/* account for the shiftout 0x0e. State is */
/* changed to double byte state. */
printf("length = %d, state = %d\n\n", length, ps);
sl += length;
length = mbrlen(&string[sl], MB_CUR_MAX, &ps);
/* The next character is also a double byte character. */
/* The state is changed to initial state since this was */
/* the last double byte character. Length is 3 to */
/* account for the ending 0x0f shiftin. */
printf("length = %d, state = %d\n\n", length, ps);
sl += length;
length = mbrlen(&string[sl], MB_CUR_MAX, &ps);
/* The next character is single byte so length is 1 and */
/* state remains in initial state. */
printf("length = %d, state = %d\n\n", length, ps);
}
/* The output should look like this:
length = 1, state = 0
MB_CUR_MAX: 1
length = 1, state = 0
MB_CUR_MAX: 4
length = 3, state = 2
length = 3, state = 0
length = 1, state = 0
*/