Spec-Zone.ru › C++

std::mbrlen

Определён в заголовочном файле <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()
{
    // allow mbrlen() to work with UTF-8 multibyte encoding
    std::setlocale(LC_ALL, "en_US.utf8");

    // UTF-8 narrow multibyte encoding
    std::string str = "水"; // or u8"\u6c34" or "\xe6\xb0\xb4"
    std::mbstate_t mb = std::mbstate_t();

    // simple use: length of a complete multibyte character
    const std::size_t len = std::mbrlen(&str[0], str.size(), &mb);
    std::cout << "The length of " << str << " is " << len << " bytes\n";

    // advanced use: restarting in the middle of a multibyte character
    const std::size_t len1 = std::mbrlen(&str[0], 1, &mb);
    if (len1 == std::size_t(-2))
        std::cout << "The first 1 byte of " << str
                  << " is an incomplete multibyte char (mbrlen returns -2)\n";

    const std::size_t len2 = std::mbrlen(&str[1], str.size() - 1, &mb);
    std::cout << "The remaining " << str.size() - 1 << " bytes of " << str
              << " hold " << len2 << " bytes of the multibyte character\n";

    // error case:
    std::cout << "Attempting to call mbrlen() in the middle of " << str
              << " while in initial shift state returns "
              << (int)mbrlen(&str[1], str.size(), &mb) << '\n';
}

Вывод:

The length of 水 is 3 bytes.
The first 1 byte of 水 is an incomplete multibyte char (mbrlen returns -2)
The remaining 2 bytes of 水 hold 2 bytes of the multibyte character
Attempting to call mbrlen() in the middle of 水 while in initial shift state returns -1

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/multibyte/mbrlen

Spec-Zone.ru

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