Namespaces
Variants

mblen

From cppreference.net
Определено в заголовочном файле <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

Смотрите также

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