mblen
Определено в заголовке <stdlib.h> | ||
|---|---|---|
int mblen( const char* s, size_t n ); |
Определяет размер, в байтах, многобайтового символа, первый байт которого указан в s.
Если s является указателем на null, сбрасывает глобальное состояние преобразования и(до C23) определяет, используются ли последовательности смены.
Эта функция эквивалентна вызову mbtowc((wchar_t*)0, s, n), за исключением того, что состояние преобразования mbtowc не затрагивается.
Параметры
| s | - | указатель на многобайтовый символ |
| n | - | ограничение на количество байтов в s, которые могут быть проверены |
Возвращаемое значение
Если s не является указателем на null, возвращает количество байтов, содержащихся в многобайтовом символе, или -1 если первые байты, на которые указывает s , не образуют допустимого многобайтового символа, или 0 если s указывает на нулевой символ '\0'.
Если s является указателем на null, сбрасывает внутреннее состояние преобразования, чтобы оно представляло начальное состояние смены, и(до C23) возвращает 0 если текущая многобайтовая кодировка не зависит от состояния (не использует последовательности смены) или ненулевое значение, если текущая многобайтовая кодировка зависит от состояния (использует последовательности смены).
Примечания
| Каждый вызов | (до C23) |
|
| (с 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 (с. 260)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.22.7.1 Функция mblen (с. 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++ для mblen |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/multibyte/mblen