mblen
Определено в заголовочном файле <stdlib.h> | ||
|---|---|---|
int mblen( const char* s, size_t n ); |
Определяет размер в байтах многобайтового символа, на первый байт которого указывает s.
Если s — нулевой указатель, сбрасывает глобальное состояние преобразования и(до C23) определяет, используются ли последовательности сдвига.
Эта функция эквивалентна вызову mbtowc((wchar_t*)0, s, n), за исключением того, что состояние преобразования mbtowc не изменяется.
Параметры
| s | - | указатель на многобайтовый символ |
| n | - | ограничение на количество байтов в s, которые можно проверить |
Возвращаемое значение
Если s не является нулевым указателем, возвращает количество байтов, содержащихся в многобайтовом символе, или -1, если первые байты, на которые указывает s, не образуют допустимый многобайтовый символ, или 0, если s указывает на нулевой символ '\0'.
Если s — нулевой указатель, сбрасывает внутреннее состояние преобразования в исходное состояние сдвига и(до 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/c/string/multibyte/mblen