mbrlen
From cppreference.net
|
定义于头文件
<wchar.h>
|
||
|
(C95 起)
(C99 前) |
||
| (C99 起) | ||
确定多字节字符表示形式的大小,以字节为单位。
此函数等效于调用 mbrtowc ( NULL , s, n, ps ? ps : & internal ) ,其中 internal 为类型 mbstate_t 的隐藏对象,不同之处在于表达式 ps 仅会被求值一次。
目录 |
参数
| s | - | 指向多字节字符串元素的指针 |
| n | - | 可检查的s中字节数的限制 |
| ps | - | 指向持有转换状态变量的指针 |
返回值
以下情况中首先适用的条件:
- 0 如果接下来的 n 个或更少字节完成空字符,或者如果 s 是空指针。这两种情况都会重置转换状态。
- 完成有效多字节字符的字节数 [ 1 ... n ]
- ( size_t ) - 2 如果接下来的 n 字节是可能有效的多字节字符的一部分,在检查完所有 n 字节后仍然不完整
- ( size_t ) - 1 如果发生编码错误。 errno 的值为 EILSEQ ;转换状态未指定。
示例
运行此代码
#include <locale.h> #include <stdio.h> #include <string.h> #include <wchar.h> int main(void) { // 允许 mbrlen() 处理 UTF-8 多字节编码 setlocale(LC_ALL, "en_US.utf8"); // UTF-8 窄多字节编码 const char* str = "水"; size_t sz = strlen(str); mbstate_t mb; memset(&mb, 0, sizeof mb); int len1 = mbrlen(str, 1, &mb); if (len1 == -2) printf("字符串 %s 的首个字节是不完整多字节字符" " (mbrlen 返回 -2)\n", str); int len2 = mbrlen(str + 1, sz - 1, &mb); printf("字符串 %s 剩余的 %zu 个字节包含该多字节字符" " 的 %d 个字节\n", sz - 1, str, len2); printf("在初始移位状态下尝试在 %s 中间调用 mbrlen() 返回 %zd\n", str, mbrlen(str + 1, sz - 1, &mb)); }
输出:
字符串 水 的首个字节是不完整多字节字符 (mbrlen 返回 -2) 字符串 水 剩余的 2 个字节包含该多字节字符的 2 个字节 在初始移位状态下尝试在 水 中间调用 mbrlen() 返回 -1
参考文献
- C23 标准 (ISO/IEC 9899:2024):
-
- 7.29.6.3.1 mbrlen 函数 (页: TBD)
- C17 标准 (ISO/IEC 9899:2018):
-
- 7.29.6.3.1 mbrlen 函数 (p: TBD)
- C11 标准 (ISO/IEC 9899:2011):
-
- 7.29.6.3.1 mbrlen 函数 (p: 442)
- C99标准(ISO/IEC 9899:1999):
-
- 7.24.6.3.1 mbrlen函数(页码:388)
参见
|
(C95)
|
根据给定状态将下一个多字节字符转换为宽字符
(函数) |
|
返回下一个多字节字符的字节数
(函数) |
|
|
C++ documentation
for
mbrlen
|
|