mblen
|
定义于头文件
<stdlib.h>
|
||
|
int
mblen
(
const
char
*
s,
size_t
n
)
;
|
||
确定由
s
指向其首字节的多字节字符的大小(以字节为单位)。
如果
s
是空指针,
重置全局转换状态并
(until C23)
确定是否使用移位序列。
此函数等效于调用 mbtowc ( ( wchar_t * ) 0 , s, n ) ,不同之处在于 mbtowc 的转换状态不受影响。
目录 |
参数
| s | - | 指向多字节字符的指针 |
| n | - | s 中可检查字节数的上限 |
返回值
如果
s
不是空指针,则返回该多字节字符包含的字节数;若
s
指向的首字节不构成有效多字节字符则返回
-
1
;若
s
指向空字符
'
\0
'
则返回
0
。
如果
s
是空指针,
将其内部转换状态重置为表示初始移位状态并
(until C23)
返回
0
(如果当前多字节编码不依赖状态,即不使用移位序列)或返回非零值(如果当前多字节编码依赖状态,即使用移位序列)。
注释
|
每次调用
|
(C23前) |
|
|
(C23起) |
示例
#include <locale.h> #include <stdio.h> #include <stdlib.h> #include <string.h> // 多字节字符串中的字符数是 mblen() 调用结果的总和 // 注意:更简单的方法是 mbstowcs(NULL, str, sz) size_t strlen_mb(const char* ptr) { size_t result = 0; const char* end = ptr + strlen(ptr); mblen(NULL, 0); // 重置转换状态 while(ptr < end) { int next = mblen(ptr, end - ptr); if (next == -1) { perror("strlen_mb"); break; } ptr += next; ++result; } return result; } void dump_bytes(const char* str) { for (const char* end = str + strlen(str); str != end; ++str) printf("%02X ", (unsigned char)str[0]); printf("\n"); } int main(void) { setlocale(LC_ALL, "en_US.utf8"); const char* str = "z\u00df\u6c34\U0001f34c"; printf("字符串 \"%s\" 包含 %zu 个字符,但占用 %zu 个字节: ", str, strlen_mb(str), strlen(str)); dump_bytes(str); }
可能的输出:
字符串 "zß水🍌" 包含 4 个字符,但占用 10 个字节: 7A C3 9F E6 B0 B4 F0 9F 8D 8C
参考文献
- C17 标准 (ISO/IEC 9899:2018):
-
- 7.22.7.1 mblen 函数 (页: 260)
- C11 标准 (ISO/IEC 9899:2011):
-
- 7.22.7.1 mblen 函数 (p: 357)
- C99标准(ISO/IEC 9899:1999):
-
- 7.20.7.1 mblen函数(页码:321)
- C89/C90 标准 (ISO/IEC 9899:1990):
-
- 4.10.7.1 mblen 函数
参见
|
将下一个多字节字符转换为宽字符
(函数) |
|
|
(C95)
|
给定状态,返回下一个多字节字符的字节数
(函数) |
|
C++ documentation
for
mblen
|
|