Namespaces
Variants

std:: mbrlen

From cppreference.net
Definido en el encabezado <cwchar>
std:: size_t mbrlen ( const char * s, std:: size_t n, std:: mbstate_t * ps ) ;

Determina el tamaño, en bytes, del resto del carácter multibyte cuyo primer byte está apuntado por s , dado el estado de conversión actual ps .

Esta función es equivalente a la llamada std:: mbrtowc ( nullptr, s, n, ps ? ps : & internal ) para algún objeto oculto internal de tipo std::mbstate_t , excepto que la expresión ps se evalúa solo una vez.

Contenidos

Parámetros

s - puntero a un elemento de una cadena de caracteres multibyte
n - límite en el número de bytes en s que pueden ser examinados
ps - puntero a la variable que contiene el estado de conversión

Valor de retorno

  • 0 si los siguientes n bytes o menos completan el carácter nulo.
  • El número de bytes (entre 1 y n ) que completan un carácter multibyte válido.
  • std:: size_t ( - 1 ) si ocurre un error de codificación.
  • std:: size_t ( - 2 ) si los siguientes n bytes son parte de un carácter multibyte posiblemente válido, que aún está incompleto después de examinar todos los n bytes.

Ejemplo

#include <clocale>
#include <cwchar>
#include <iostream>
#include <string>
int main()
{
    // permitir que mbrlen() funcione con codificación multibyte UTF-8
    std::setlocale(LC_ALL, "en_US.utf8");
    // codificación multibyte estrecha UTF-8
    std::string str = "水"; // or u8"\u6c34" or "\xe6\xb0\xb4"
    std::mbstate_t mb = std::mbstate_t();
    // uso simple: longitud de un carácter multibyte completo
    const std::size_t len = std::mbrlen(&str[0], str.size(), &mb);
    std::cout << "La longitud de " << str << " es " << len << " bytes\n";
    // uso avanzado: reinicio en medio de un carácter multibyte
    const std::size_t len1 = std::mbrlen(&str[0], 1, &mb);
    if (len1 == std::size_t(-2))
        std::cout << "El primer byte de " << str
                  << " es un carácter multibyte incompleto (mbrlen retorna -2)\n";
    const std::size_t len2 = std::mbrlen(&str[1], str.size() - 1, &mb);
    std::cout << "Los " << str.size() - 1 << " bytes restantes de " << str
              << " contienen " << len2 << " bytes del carácter multibyte\n";
    // caso de error:
    std::cout << "Intentar llamar a mbrlen() en medio de " << str
              << " mientras está en estado de desplazamiento inicial retorna "
              << (int)mbrlen(&str[1], str.size(), &mb) << '\n';
}

Salida:

La longitud de 水 es 3 bytes.
El primer byte de 水 es un carácter multibyte incompleto (mbrlen retorna -2)
Los 2 bytes restantes de 水 contienen 2 bytes del carácter multibyte
Intentar llamar a mbrlen() en medio de 水 mientras está en estado de desplazamiento inicial retorna -1

Véase también

convierte el siguiente carácter multibyte a carácter ancho, dado el estado
(función)
devuelve el número de bytes en el siguiente carácter multibyte
(función)
[virtual]
calcula la longitud de la cadena ExternT que sería consumida por conversión al búfer InternT dado
(función miembro protegida virtual de std::codecvt<InternT,ExternT,StateT> )