c32rtomb
|
Definido en el encabezado
<uchar.h>
|
||
| (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
|
(C11)
|
convierte un carácter multibyte estrecho a codificación UTF-32
(función) |
|
C++ documentation
para
c32rtomb
|
|