Namespaces
Variants

std:: mbrtowc

From cppreference.net
Definido en el encabezado <cwchar>
std:: size_t mbrtowc ( wchar_t * pwc,

const char * s,
std:: size_t n,

std:: mbstate_t * ps ) ;

Convierte un carácter multibyte estrecho a un carácter ancho.

Si s no es un puntero nulo, inspecciona como máximo n bytes de la cadena de caracteres multibyte, comenzando por el byte apuntado por s para determinar el número de bytes necesarios para completar el siguiente carácter multibyte (incluyendo cualquier secuencia de desplazamiento). Si la función determina que el siguiente carácter multibyte en s está completo y es válido, lo convierte al carácter ancho correspondiente y lo almacena en * pwc (si pwc no es nulo).

Si s es un puntero nulo, los valores de n y pwc se ignoran y la llamada es equivalente a std :: mbrtowc ( nullptr, "" , 1 , ps ) .

Si el carácter ancho producido es el carácter nulo, el estado de conversión almacenado en * ps es el estado de desplazamiento inicial.

Contenidos

Parámetros

pwc - puntero a la ubicación donde se escribirá el carácter ancho resultante
s - puntero a la cadena de caracteres multibyte utilizada como entrada
n - límite en el número de bytes en s que pueden examinarse
ps - puntero al estado de conversión utilizado al interpretar la cadena multibyte

Valor de retorno

La primera de las siguientes que aplique:

  • 0 si el carácter convertido desde s (y almacenado en pwc si no es nulo) era el carácter nulo.
  • el número de bytes [ 1 ... n ] del carácter multibyte convertido exitosamente desde s .
  • static_cast < std:: size_t > ( - 2 ) si los siguientes n bytes constituyen un carácter multibyte incompleto, pero válido hasta el momento. No se escribe nada en * pwc .
  • static_cast < std:: size_t > ( - 1 ) si ocurre un error de codificación. No se escribe nada en * pwc , el valor EILSEQ se almacena en errno y el valor de * ps queda sin especificar.

Ejemplo

#include <clocale>
#include <cstring>
#include <cwchar>
#include <iostream>
void print_mb(const char* ptr)
{
    std::mbstate_t state = std::mbstate_t(); // estado inicial
    const char* end = ptr + std::strlen(ptr);
    int len;
    wchar_t wc;
    while ((len = std::mbrtowc(&wc, ptr, end-ptr, &state)) > 0)
    {
        std::wcout << "Siguientes " << len << " bytes son el carácter " << wc << '\n';
        ptr += len;
    }
}
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    // Codificación multibyte estrecha UTF-8
    const char* str = "z\u00df\u6c34\U0001d10b"; // o u8"zß水𝄋"
                      // o "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
    print_mb(str);
}

Salida:

Siguientes 1 bytes son el carácter z
Siguientes 2 bytes son el carácter ß
Siguientes 3 bytes son el carácter 水
Siguientes 4 bytes son el carácter 𝄋

Véase también

convierte el siguiente carácter multibyte a carácter ancho
(función)
convierte un carácter ancho a su representación multibyte, dado un estado
(función)
[virtual]
convierte una cadena de ExternT a InternT , como cuando se lee desde un archivo
(función miembro protegida virtual de std::codecvt<InternT,ExternT,StateT> )