Namespaces
Variants

std:: mbrlen

From cppreference.net
Определено в заголовке <cwchar>
std:: size_t mbrlen ( const char * s, std:: size_t n, std:: mbstate_t * ps ) ;

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

Эта функция эквивалентна вызову std:: mbrtowc ( nullptr, s, n, ps ? ps : & internal ) для некоторого скрытого объекта internal типа std::mbstate_t , за исключением того, что выражение ps вычисляется только один раз.

Содержание

Параметры

s - указатель на элемент многобайтовой строки символов
n - ограничение на количество байтов в s, которые могут быть проверены
ps - указатель на переменную, содержащую состояние преобразования

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

  • 0 если следующие n или меньше байт завершают нулевой символ.
  • Количество байт (от 1 до n ), которые завершают корректный многобайтовый символ.
  • std:: size_t ( - 1 ) при ошибке кодирования.
  • std:: size_t ( - 2 ) если следующие n байт являются частью потенциально корректного многобайтового символа, который остаётся неполным после проверки всех n байт.

Пример

#include <clocale>
#include <cwchar>
#include <iostream>
#include <string>
int main()
{
    // разрешить mbrlen() работать с многобайтовой кодировкой UTF-8
    std::setlocale(LC_ALL, "en_US.utf8");
    // многобайтовая кодировка UTF-8
    std::string str = "水"; // или u8"\u6c34" или "\xe6\xb0\xb4"
    std::mbstate_t mb = std::mbstate_t();
    // простое использование: длина полного многобайтового символа
    const std::size_t len = std::mbrlen(&str[0], str.size(), &mb);
    std::cout << "Длина символа " << str << " составляет " << len << " байт\n";
    // продвинутое использование: перезапуск в середине многобайтового символа
    const std::size_t len1 = std::mbrlen(&str[0], 1, &mb);
    if (len1 == std::size_t(-2))
        std::cout << "Первый 1 байт символа " << str
                  << " является неполным многобайтовым символом (mbrlen возвращает -2)\n";
    const std::size_t len2 = std::mbrlen(&str[1], str.size() - 1, &mb);
    std::cout << "Оставшиеся " << str.size() - 1 << " байт символа " << str
              << " содержат " << len2 << " байт многобайтового символа\n";
    // случай ошибки:
    std::cout << "Попытка вызова mbrlen() в середине символа " << str
              << " при начальном состоянии сдвига возвращает "
              << (int)mbrlen(&str[1], str.size(), &mb) << '\n';
}

Вывод:

Длина символа 水 составляет 3 байта.
Первый 1 байт символа 水 является неполным многобайтовым символом (mbrlen возвращает -2)
Оставшиеся 2 байт символа 水 содержат 2 байт многобайтового символа
Попытка вызова mbrlen() в середине символа 水 при начальном состоянии сдвига возвращает -1

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

преобразует следующий многобайтовый символ в широкий символ с учётом состояния
(функция)
возвращает количество байт в следующем многобайтовом символе
(функция)
[virtual]
вычисляет длину строки ExternT , которая была бы преобразована в заданный буфер InternT
(виртуальная защищённая функция-член std::codecvt<InternT,ExternT,StateT> )