mbrtoc16
|
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 16 bits de longitud variable (normalmente, UTF-16).
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 16 bits correspondiente y lo almacena en * pc16 (si pc16 no es nulo).
Si el carácter multibyte en
*
s
corresponde a una secuencia multi-
char16_t
(por ejemplo, un par sustituto en UTF-16), entonces después de la primera llamada a esta función,
*
ps
se actualiza de manera que la siguiente llamada a
mbrtoc16
escribirá el
char16_t
adicional, sin considerar
*
s
.
Si s es un puntero nulo, los valores de n y pc16 se ignoran y la llamada es equivalente a mbrtoc16 ( 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_16__ está definida, la codificación de 16 bits utilizada por esta función es UTF-16; de lo contrario, está definida por la implementación. La macro siempre está definida y la codificación es siempre UTF-16. (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
| pc16 | - | puntero a la ubicación donde se escribirá el carácter ancho de 16 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 * pc16 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 char16_t de un carácter multi- char16_t (por ejemplo, un par sustituto) ha sido ahora escrito en * pc16 . 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 * pc16 .
- ( size_t ) - 1 si ocurre un error de codificación. No se escribe nada en * pc16 , el valor EILSEQ se almacena en errno y el valor de * ps no está especificado.
Ejemplo
En MSVC puede necesitar la bandera de compilador
/utf-8
para que UTF_8 funcione correctamente.
#include <locale.h> #include <stdio.h> #include <uchar.h> int main(void) { setlocale(LC_ALL, "en_US.utf8"); const char in[] = u8"zß水🍌"; // or "z\u00df\u6c34\U0001F34C" enum { in_sz = sizeof in / sizeof *in }; printf("Processing %d UTF-8 code units: [", in_sz); for (int n = 0; n < in_sz; ++n) printf("%s%02X", n ? " " : "", (unsigned char)in[n]); puts("]"); char16_t out[in_sz]; const char* p_in = in; const char* end = in + in_sz; char16_t* p_out = out; mbstate_t state = {0}; for (size_t rc; (rc = mbrtoc16(p_out, p_in, end - p_in, &state));) { if (rc == (size_t)-1) // invalid input break; else if(rc == (size_t)-2) // truncated input break; else if(rc == (size_t)-3) // UTF-16 high surrogate p_out += 1; else { p_in += rc; p_out += 1; }; } const size_t out_sz = p_out - out + 1; printf("into %zu UTF-16 code units: [", out_sz); for (size_t x = 0; x < out_sz; ++x) printf("%s%04X", x ? " " : "", out[x]); puts("]"); }
Salida:
Processing 11 UTF-8 code units: [7A C3 9F E6 B0 B4 F0 9F 8D 8C 00] into 6 UTF-16 code units: [007A 00DF 6C34 D83C DF4C 0000]
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 7.30.1.3 La función mbrtoc16 (p: 408-409)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.28.1.1 La función mbrtoc16 (p: 398-399)
Véase también
|
(C11)
|
convierte un carácter UTF-16 a codificación multibyte estrecha
(función) |
|
C++ documentation
para
mbrtoc16
|
|