Namespaces
Variants

mbrtowc

From cppreference.net
Definido en el encabezado <wchar.h>
size_t mbrtowc ( wchar_t * pwc, const char * s, size_t n, mbstate_t * ps ) ;
(desde C95)
size_t mbrtowc ( wchar_t * restrict pwc, const char * restrict s, size_t n,
mbstate_t * restrict ps ) ;
(desde C99)

Convierte un carácter multibyte estrecho a su representación de carácter ancho.

Si s no es un puntero nulo, inspecciona como máximo n bytes de la cadena de caracteres multibyte, comenzando desde 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, y teniendo en cuenta el estado actual de conversión multibyte * ps ). 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 mbrtowc ( NULL , "" , 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.

Si la macro del entorno __STDC_ISO_10646__ está definida, los valores del tipo wchar_t son iguales a los identificadores cortos de los caracteres en el conjunto requerido de Unicode (normalmente codificación UTF-32); de lo contrario, está definido por la implementación. En cualquier caso, la codificación de caracteres multibyte utilizada por esta función está especificada por la configuración regional de C actualmente activa.

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 ser examinados
ps - puntero al estado de conversión utilizado al interpretar la cadena de caracteres 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
  • ( 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 .
  • ( 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 <stdio.h>
#include <locale.h>
#include <string.h>
#include <wchar.h>
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    mbstate_t state;
    memset(&state, 0, sizeof state);
    char in[] = u8"z\u00df\u6c34\U0001F34C"; // or u8"zß水🍌"
    size_t in_sz = sizeof in / sizeof *in;
    printf("Processing %zu UTF-8 code units: [ ", in_sz);
    for(size_t n = 0; n < in_sz; ++n) printf("%#x ", (unsigned char)in[n]);
    puts("]");
    wchar_t out[in_sz];
    char *p_in = in, *end = in + in_sz;
    wchar_t *p_out = out;
    int rc;
    while((rc = mbrtowc(p_out, p_in, end - p_in, &state)) > 0)
    {
        p_in += rc;
        p_out += 1;
    }
    size_t out_sz = p_out - out + 1;
    printf("into %zu wchar_t units: [ ", out_sz);
    for(size_t x = 0; x < out_sz; ++x) printf("%#x ", out[x]);
    puts("]");
}

Salida:

Processing 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]
into 5 wchar_t units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ]

Referencias

  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.29.6.3.2 La función mbrtowc (p: 443)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.24.6.3.2 La función mbrtowc (p: 389)

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 el estado
(función)