Spec-Zone.ru › C

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

Примечания

Каждый вызов 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/w/c/string/multibyte/mblen

Spec-Zone.ru

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