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() { // разрешить 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>
)
|
|
Документация C
для
mbrlen
|
|