Spec-Zone.ru › C

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, если текущая многобайтовая кодировка не зависит от состояния (не использует последовательности сдвига), или ненулевое значение, если текущая многобайтовая кодировка зависит от состояния (использует последовательности сдвига).

Примечания

Каждый вызов 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 (стр. 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

См. также

mbtowc
преобразует следующий многобайтовый символ в широкий символ
(функция)
mbrlen
(C95)
возвращает количество байтов в следующем многобайтовом символе с учётом состояния
(функция)
Документация по C++ для mblen

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/string/multibyte/mblen

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API