Пространства имён
Варианты
Действия

std::mblen

Материал из cppreference.com
< cpp‎ | string‎ | multibyte
Определено в заголовочном файле <cstdlib>
int mblen( const char* s, std::size_t n );

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

Если s нулевой указатель, то сбрасывается глобальное состояние преобразования и определяется используеться ли сдвиг регистра (Shift Sequences) или нет.

Это функция эквивалента вызову std::mbtowc((wchar_t*)0, s, n), но с той разницей, что состояние преобразования std::mbtowc остаётся нетронутым.

Содержание

[править] Примечание

Каждый вызов mblen обновляет глобальное внутреннее состояние преобразования (в статическом объекте типа std::mbstate_t, известного только этой функции). Если многобайтовая кодировка использует сдвиг регистра необходимо соблюдать осторожность, чтобы не допустить возвратов или повторного сканирования. В любом случае, из нескольких поток не следует запускать mblen без синхронизации: в противном случае можно воспользоваться std::mbrlen.

[править] Параметры

s - Указатель на многобайтовый символ
n - Предельный размер одного символа для определения.

[править] Возвращаемое значение

Если s не нулевой указатель, то возвращается количество байтов, который содержит многобайтовый символ или -1, если первый байт, доступный по указателю s, не является корректным мультибайтовым символом или 0, если s - это указатель на нулевой символ '\0'.

Если s равен нулевому указателю, то сбрасывается внутреннее состояние преобразования, чтобы вернуть первоначальное состояние сдвига регистра и возвращает 0, если текущая многобайтовая кодировка не является зависимой от состояния регистра (не использует последовательность сдвига регистра) или ненулевое значение, если она зависит от этого состояния (использует сдвиг регистра).

[править] Пример

#include <clocale>
#include <string>
#include <iostream>
#include <cstdlib>
#include <stdexcept>
 
 
//Количество символов в многобайтовой строке - это сумма mblen()
//Примечание: более простой подход воспользоваться 
//std::mbstowcs(NULL, s.c_str(), s.size())
std::size_t strlen_mb(const std::string& s)
{
    std::size_t result = 0;
    const char* ptr = s.data();
    const char* end = ptr + s.size();
    std::mblen(NULL, 0); // Сброс внутреннего состояния
    while (ptr < end) {
        int next = std::mblen(ptr, end-ptr);
        if (next == -1) {
            throw std::runtime_error("strlen_mb(): Ошибка преобразования");
        }
        ptr += next;
        ++result;
    }
    return result;
}
 
int main()
{
    //позволяет mblen() работать с многобайтовой кодировкой UTF-8
    std::setlocale(LC_ALL, "en_US.utf8");
    // Кодируем строку в UTF-8
    std::string str = u8"z\u00df\u6c34\U0001f34c"; // или u8"zß水🍌"
    std::cout << str << " занимает " << str.size() << " байт, но тут "
              << strlen_mb(str) << " символов\n";
}

Вывод:

zß水🍌 занимает 10 bytes, байт, но тут 4 символов

[править] См. также

Преобразует заданный мультибайтовый символ в широкий символ
(функция) [править]
возвращает количество байтов в следующем многобайтового символа, данное состояние
Оригинал:
returns the number of bytes in the next multibyte character, given state
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(функция) [править]
C documentation for mblen