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

std::mbrlen

Материал из cppreference.com
< cpp‎ | string‎ | multibyte
 
 
 
Многобайтовые строки с завершающим нулём
Широкие/многобайтовые преобразования
Типы
 
Определено в заголовочном файле <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), завершающих допустимый многобайтовый символ.

(size_t) - 1, если произошла ошибка кодирования.

(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();
    int len1 = std::mbrlen(&str[0], 1, &mb);
    if (len1 == -2)
        std::cout << "Первый 1 байт " << str
                  << " представляет собой неполный многобайтовый символ (mbrlen возвращает -2)\n";
    int 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';
 
}

Вывод:

Первый 1 байт 水 представляет собой неполный многобайтовый символ (mbrlen возвращает -2)
Остальные 2 байта 水 хранят 2 байтов многобайтового символа
Попытка вызвать mbrlen() в середине 水 , в то время как в исходном состоянии сдвига возвращается -1

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

преобразует следующий многобайтовый символ в широкий символ при заданном состоянии
(функция) [править]
возвращает количество байтов в следующем мультибайтовом символе
(функция) [править]
[virtual]
вычисляет длину externT строку, которая будет потребляться преобразования в данной internT буфера
Оригинал:
calculates the length of the externT string that would be consumed by conversion into given internT buffer
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(virtual protected std::codecvt функция-элемент) [править]