mbrtoc32
|
Definido en el encabezado
<uchar.h>
|
||
| (desde C11) | ||
Convierte un único punto de código de su representación de carácter multibyte estrecho a su representación de carácter ancho de 32 bits de longitud variable (pero típicamente, UTF-32).
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, 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 de 32 bits correspondiente y lo almacena en * pc32 (si pc32 no es nulo).
Si el carácter multibyte en
*
s
corresponde a una secuencia multi-
char32_t
(no posible con UTF-32), entonces después de la primera llamada a esta función,
*
ps
se actualiza de manera que las siguientes llamadas a
mbrtoc32
escribirán los
char32_t
adicionales, sin considerar
*
s
.
Si s es un puntero nulo, los valores de n y pc32 se ignoran y la llamada es equivalente a mbrtoc32 ( NULL , "" , 1 , ps ) .
Si el carácter ancho producido es el carácter nulo, el estado de conversión * ps representa el estado de desplazamiento 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
| pc32 | - | puntero a la ubicación donde se escribirá el carácter ancho de 32 bits 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 objeto de 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 * pc32 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 ) - 3 si el siguiente char32_t de un carácter multi- char32_t ha sido ahora escrito en * pc32 . No se procesan bytes de la entrada en este caso.
- ( size_t ) - 2 si los siguientes n bytes constituyen un carácter multibyte incompleto, pero hasta ahora válido. No se escribe nada en * pc32 .
- ( size_t ) - 1 si ocurre un error de codificación. No se escribe nada en * pc32 , el valor EILSEQ se almacena en errno y el valor de * ps no está especificado.
Ejemplo
En MSVC necesitarás la bandera de compilador
/utf-8
para que UTF_8 funcione correctamente.
#include <assert.h> #include <locale.h> #include <stdio.h> #include <uchar.h> int main(void) { setlocale(LC_ALL, "en_US.utf8"); char in[] = u8"zß水🍌"; // or "z\u00df\u6c34\U0001F34C" enum { in_size = sizeof in / sizeof *in }; printf("Processing %d UTF-8 code units: [", in_size); for (int i = 0; i < in_size; ++i) printf("%s%02X", i ? " " : "", (unsigned char)in[i]); puts("]"); char32_t out[in_size]; char32_t* p_out = out; char* p_in = in; char* end = in + in_size; mbstate_t state = {0}; size_t rc; while ((rc = mbrtoc32(p_out, p_in, end - p_in, &state))) { assert(rc != (size_t)-3); // no surrogate pairs in UTF-32 if (rc == (size_t)-1) break; // invalid input if (rc == (size_t)-2) break; // truncated input p_in += rc; ++p_out; } size_t out_size = p_out+1 - out; printf("into %zu UTF-32 code units: [", out_size); for (size_t i = 0; i < out_size; ++i) printf("%s%08X", i ? " " : "", out[i]); puts("]"); }
Salida:
Processing 11 UTF-8 code units: [7A C3 9F E6 B0 B4 F0 9F 8D 8C 00] into 5 UTF-32 code units: [0000007A 000000DF 00006C34 0001F34C 00000000]
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 7.30.1.5 La función mbrtoc32 (p: 410)
- Estándar C17 (ISO/IEC 9899:2018):
-
- 7.28.1.3 La función mbrtoc32 (p: 293-294)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.28.1.3 La función mbrtoc32 (p: 400-401)
Véase también
|
(C11)
|
convierte un carácter UTF-32 a codificación multibyte estrecha
(función) |
|
C++ documentation
para
mbrtoc32
|
|