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