Namespaces
Variants

c32rtomb

From cppreference.net
Definido en el encabezado <uchar.h>
size_t c32rtomb ( char * restrict s, char32_t c32, mbstate_t * restrict ps ) ;
(desde C11)

Convierte un único punto de código de su representación de caracteres anchos de 32 bits de longitud variable (pero típicamente, UTF-32) a su representación de caracteres multibyte estrechos.

Si s no es un puntero nulo, la función determina el número de bytes necesarios para almacenar la representación del carácter multibyte de c32 (incluyendo cualquier secuencia de desplazamiento, y tomando en cuenta el estado actual de conversión multibyte * ps ), y almacena la representación del carácter multibyte en el arreglo de caracteres cuyo primer elemento está apuntado por s , actualizando * ps según sea necesario. Como máximo MB_CUR_MAX bytes pueden ser escritos por esta función.

Si s es un puntero nulo, la llamada es equivalente a c32rtomb ( buf, U ' \0 ' , ps ) para algún búfer interno buf .

Si c32 es el carácter ancho nulo U ' \0 ' , se almacena un byte nulo, precedido por cualquier secuencia de cambio necesaria para restaurar el estado de cambio inicial y el parámetro de estado de conversión * ps se actualiza para representar el estado de cambio inicial.

Si la macro __STDC_UTF_32__ está definida, la codificación de 32 bits utilizada por esta función es UTF-32; de lo contrario, está definida por la implementación. La macro siempre está definida y la codificación es siempre UTF-32. (desde C23) 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

s - puntero al arreglo de caracteres estrechos donde se almacenará el carácter multibyte
c32 - el carácter ancho de 32 bits a convertir
ps - puntero al objeto de estado de conversión utilizado al interpretar la cadena multibyte

Valor de retorno

En caso de éxito, retorna el número de bytes (incluyendo cualquier secuencia de desplazamiento) escritos en el arreglo de caracteres cuyo primer elemento está apuntado por s . Este valor puede ser 0 , por ejemplo, al procesar las unidades char32_t iniciales en una secuencia multiunidad de char32_t (no ocurre en UTF-32).

En caso de fallo (si c32 no es un carácter ancho de 32 bits válido), retorna - 1 , almacena EILSEQ en errno , y deja * ps en un estado no especificado.

Ejemplo

En MSVC necesitarás el /utf-8 flag del compilador para que UTF_8 funcione correctamente.

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <uchar.h>
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    const char32_t in[] = U"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
    size_t in_sz = sizeof in / sizeof *in;
    printf("Processing %zu UTF-32 code units: [", in_sz);
    for (size_t n = 0; n < in_sz; ++n)
        printf("%s%08X", n ? " " : "", in[n]);
    puts("]");
    char* out = malloc(MB_CUR_MAX * in_sz);
    char* p = out;
    mbstate_t state = {0};
    for (size_t n = 0; n < in_sz; ++n)
    {
        size_t rc = c32rtomb(p, in[n], &state);
        if(rc == (size_t)-1) break;
        p += rc;
    }
    size_t out_sz = p - out;
    printf("into %zu UTF-8 code units: [", out_sz);
    for (size_t x = 0; x < out_sz; ++x)
        printf("%s%02X", x ? " " : "", +(unsigned char)out[x]);
    puts("]");
    free(out);
}

Salida:

Processing 5 UTF-32 code units: [0000007A 000000DF 00006C34 0001F34C 00000000]
into 11 UTF-8 code units: [7A C3 9F E6 B0 B4 F0 9F 8D 8C 00]

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.30.1.6 La función c32rtomb (p: 411)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.28.1.4 La función c32rtomb (p: 401)

Véase también

convierte un carácter multibyte estrecho a codificación UTF-32
(función)
C++ documentation para c32rtomb