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) для завершения валидного многобайтового символа.
(size_t) - 1 , если произошла ошибка кодирования.
(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();
int len1 = std::mbrlen(&str[0], 1, &mb);
if (len1 == -2)
std::cout << "The first 1 byte of " << str
<< " is an incomplete multibyte char (mbrlen returns -2)\n";
int 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";
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 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
См. также
| преобразует следующий многобайтовый символ в широкий символ, учитывая состояние (функция) |
|
| возвращает количество байтов в следующем многобайтовом символе (функция) |
|
|
[virtual] |
вычисляет длину строки 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/w/cpp/string/multibyte/mbrlen