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++ documentation
для
mblen
|
|