std::mbrlen
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <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 функция-элемент)
|
Документация C по mbrlen
| |