Поделиться через


mbrlen

Определяют число байтов, необходимое для составления многобайтового символа в текущем языковом стандарте, с возможностью перезапуска в середине многобайтового символа.

Синтаксис

size_t mbrlen(
   const char * str,
   size_t count,
   mbstate_t * mbstate
);

Параметры

str
Указатель на следующий байт для проверки в строке многобайтовых символов.

count
Максимальное число байтов для проверки.

mbstate
Указатель на текущее состояние сдвига начального байта str.

Возвращаемое значение

Одно из следующих значений:

значение Описание
0 Если следующие count или менее байт составляют многобайтовый символ, представляющий расширенный нуль-символ.
от 1 до count включительно Если следующие count или менее байт составляют допустимый многобайтовый символ. Возвращаемое значение равно количеству байтов, составляющих многобайтовый символ.
(size_t)(-2) Если следующие count байт складываются в неполный, но потенциально допустимый многобайтовый символ и все байты count были обработаны.
(size_t)(-1) Произошла ошибка кодирования. Следующие count или меньше байтов не вносят свой вклад в полный и допустимый многобайтовый символ. В этом случае для errno будет установлено значение EILSEQ, а состояние преобразования в mbstate будет не определено.

Замечания

Функция mbrlen проверяет не более count байт, начиная с байта, на который указывает параметр str, для определения числа байтов, необходимых для составления следующего многобайтового символа, включая любые последовательности сдвигов. Это эквивалентно вызову mbrtowc(NULL, str, count, &mbstate) , где mbstate является либо предоставленный пользователем mbstate_t объект, либо статический внутренний объект, предоставляемый библиотекой.

Функция mbrlen сохраняет и использует состояние сдвига неполного многобайтового символа в параметре mbstate. Поэтому **mbrlen**может перезапустить в середине многобайтового символа, если это необходимо, и проверить не более count байтов. Если mbstate является пустым указателем, mbrlen использует внутренний статичный объект mbstate_t для хранения состояния сдвига. Так как внутренний mbstate_t объект не является потокобезопасной, рекомендуется всегда выделять и передавать собственный mbstate параметр.

Функция mbrlen отличается от _mbclen, mblen_mblen_l по его перезапуску. Состояние сдвига хранится в переменной mbstate для последующих вызовов тех же или других перезапускаемых функций. При смешанном использовании перезапускаемых и неперезапускаемых функций результаты становятся неопределенными. Например, в приложении необходимо использовать функцию wcsrlen вместо функции wcslen, если в последующем вызове используется функция wcsrtombs, а не функция wcstombs.

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма TCHAR.H _UNICODE и _MBCS не определен _MBCS Определенные _UNICODE Определенные
Неприменимо Неприменимо mbrlen Неприменимо

Требования

Маршрут Обязательный заголовок
mbrlen <wchar.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

В этом примере показано, как интерпретация многобайтовых символов зависит от текущей кодовой страницы, и демонстрируется возможность продолжения выполнения функции mbrlen.

// crt_mbrlen.c
// Compile by using: cl crt_mbrlen.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>

size_t Example(const char * pStr)
{
    size_t      charLen = 0;
    size_t      charCount = 0;
    mbstate_t   mbState = {0};

    while ((charLen = mbrlen(pStr++, 1, &mbState)) != 0 &&
            charLen != (size_t)-1)
    {
        if (charLen != (size_t)-2) // if complete mbcs char,
        {
            charCount++;
        }
    }
    return (charCount);
}

int main( void )
{
    int         cp;
    size_t      charCount = 0;
    const char  *pSample =
        "\x82\xD0\x82\xE7\x82\xAA\x82\xC8: Shift-jis hiragana.";

    cp = _getmbcp();
    charCount = Example(pSample);
    printf("\nCode page: %d\n%s\nCharacter count: %d\n",
        cp, pSample, charCount);

    setlocale(LC_ALL, "ja-JP"); // Set Japanese locale
    _setmbcp(932); // and Japanese multibyte code page
    cp = _getmbcp();
    charCount = Example(pSample);
    printf("\nCode page: %d\n%s\nCharacter count: %d\n",
        cp, pSample, charCount);
}

Code page: 0
é╨éτé¬é╚: Shift-jis hiragana.
Character count: 29

Code page: 932
????: Shift-jis hiragana.
Character count: 25

См. также

Обработка строк
Локаль