命名空间
变体
操作

mblen

来自 cppreference.com
< c‎ | string‎ | multibyte
定义在头文件 <stdlib.h>
int mblen( const char* s, size_t n );

确定以 s 指向的第一个字节为首的多字节字符的大小(以字节为单位)。

如果 s 是一个空指针,重置全局转换状态并(直到 C23) 确定是否使用移位序列。

此函数等效于调用 mbtowc((wchar_t*)0, s, n),不同之处在于 mbtowc 的转换状态不受影响。

内容

[编辑] 参数

s - 指向多字节字符的指针
n - s 中可检查的字节数限制

[编辑] 返回值

如果 s 不是空指针,则返回多字节字符中包含的字节数,如果 s 指向的第一个字节不构成有效的字符,则返回 -1,如果 s 指向空字符 '\0',则返回 0

如果 s 是一个空指针,将它的内部转换状态重置为表示初始移位状态,并且(直到 C23) 如果当前多字节编码不是状态相关的(不使用移位序列),则返回 0,如果当前多字节编码是状态相关的(使用移位序列),则返回一个非零值。

[编辑] 注释

每次调用 mblen 都会更新内部全局转换状态(一个类型为 mbstate_t 的静态对象,只对该函数可见)。如果多字节编码使用移位状态,则必须小心避免回溯或多次扫描。无论如何,多个线程不应该在没有同步的情况下调用 mblen:可以使用 mbrlen 来代替。

(直到 C23)

mblen 不允许有内部状态。

(自 C23 起)

[编辑] 示例

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
// the number of characters in a multibyte string is the sum of mblen()'s
// note: the simpler approach is mbstowcs(NULL, str, sz)
size_t strlen_mb(const char* ptr)
{
    size_t result = 0;
    const char* end = ptr + strlen(ptr);
    mblen(NULL, 0); // reset the conversion state
    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("The string \"%s\" consists of %zu characters, but %zu bytes: ",
            str, strlen_mb(str), strlen(str));
    dump_bytes(str);
}

可能的输出

The string "zß水🍌" consists of 4 characters, but 10 bytes: 7A C3 9F E6 B0 B4 F0 9F 8D 8C

[编辑] 参考文献

  • C17 标准 (ISO/IEC 9899:2018)
  • 7.22.7.1 mblen 函数 (p: 260)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.22.7.1 mblen 函数 (p: 357)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.20.7.1 mblen 函数 (p: 321)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 4.10.7.1 mblen 函数

[编辑] 参见

将下一个多字节字符转换为宽字符
(函数) [编辑]
(C95)
返回下一个多字节字符的字节数,给定状态
(函数) [编辑]
C++ 文档 for mblen