wctomb, wctomb_s
|
Definido en el encabezado
<stdlib.h>
|
||
|
int
wctomb
(
char
*
s,
wchar_t
wc
)
;
|
(1) | |
|
errno_t wctomb_s
(
int
*
restrict
status,
char
*
restrict
s, rsize_t ssz,
wchar_t
wc
)
;
|
(2) | (desde C11) |
wc
a codificación multibyte y lo almacena (incluyendo cualquier secuencia de desplazamiento) en el array de caracteres cuyo primer elemento está apuntado por
s
. No se almacenan más de
MB_CUR_MAX
caracteres. La conversión está afectada por la categoría LC_CTYPE de la configuración regional actual.
wc
es el carácter nulo, el byte nulo se escribe en
s
, precedido por cualquier secuencia de cambio necesaria para restaurar el estado de cambio inicial.
s
es un puntero nulo, esta función restablece el estado de conversión global y determina si se utilizan secuencias de desplazamiento.
status
y los siguientes errores se detectan en tiempo de ejecución y llaman a la función
constraint handler
actualmente instalada:
-
-
sszes menor que el número de bytes que se escribirían (a menos quessea null) -
sszes mayor que RSIZE_MAX (a menos quessea null) -
ses un puntero nulo perosszno es cero
-
-
Como con todas las funciones con verificación de límites,
wctomb_ssolo está garantizada que esté disponible si __STDC_LIB_EXT1__ está definido por la implementación y si el usuario define __STDC_WANT_LIB_EXT1__ como la constante entera 1 antes de incluir <stdlib.h> .
Contenidos |
Notas
Cada llamada a
wctomb
actualiza el estado de conversión global interno (un objeto estático de tipo
mbstate_t
, conocido únicamente por esta función). Si la codificación multibyte utiliza estados de cambio, esta función no es reentrante. En cualquier caso, múltiples hilos no deberían llamar a
wctomb
sin sincronización:
wcrtomb
o
wctomb_s
pueden usarse en su lugar.
A diferencia de la mayoría de las funciones con verificación de límites,
wctomb_s
no termina su salida con nulo, porque está diseñada para usarse en bucles que procesan cadenas carácter por carácter.
Parámetros
| s | - | puntero al arreglo de caracteres para salida |
| wc | - | carácter ancho a convertir |
| ssz | - |
número máximo de bytes a escribir en
s
(tamaño del arreglo
s
)
|
| status | - | puntero a un parámetro de salida donde se almacenará el resultado (longitud de la secuencia multibyte o el estado de la secuencia de desplazamiento) |
Valor de retorno
s
no es un puntero nulo, devuelve el número de bytes contenidos en la representación multibyte de
wc
o
-
1
si
wc
no es un carácter válido.
s
es un puntero nulo, restablece su estado de conversión interno para representar el estado de desplazamiento inicial y retorna
0
si la codificación multibyte actual no depende del estado (no utiliza secuencias de desplazamiento) o un valor distinto de cero si la codificación multibyte actual depende del estado (utiliza secuencias de desplazamiento).
wc
se almacena en
s
y su longitud se almacena en
*
status
, o, si
s
es nulo, el estado de la secuencia de desplazamiento se almacena en
status
). Diferente de cero en error de codificación o violación de restricción en tiempo de ejecución, en cuyo caso
(
size_t
)
-
1
se almacena en
*
status
. El valor almacenado en
*
status
nunca excede
MB_CUR_MAX
Ejemplo
#include <stdio.h> #include <stdlib.h> #include <locale.h> void demo(wchar_t wc) { const char* dep = wctomb(NULL, wc) ? "Yes" : "No"; printf("State-dependent encoding? %s.\n", dep); char mb[MB_CUR_MAX]; int len = wctomb(mb, wc); printf("wide char '%lc' -> multibyte char [", wc); for (int idx = 0; idx < len; ++idx) printf("%s%#2x", idx ? " " : "", (unsigned char)mb[idx]); printf("]\n"); } int main(void) { setlocale(LC_ALL, "en_US.utf8"); printf("MB_CUR_MAX = %zu\n", MB_CUR_MAX); demo(L'A'); demo(L'\u00df'); demo(L'\U0001d10b'); }
Salida posible:
MB_CUR_MAX = 6 State-dependent encoding? No. wide char 'A' -> multibyte char [0x41] State-dependent encoding? No. wide char 'ß' -> multibyte char [0xc3 0x9f] State-dependent encoding? No. wide char '𝄋' -> multibyte char [0xf0 0x9d 0x84 0x8b]
Referencias
- Estándar C17 (ISO/IEC 9899:2018):
-
- 7.22.7.3 La función wctomb (p: 261)
-
- K.3.6.4.1 La función wctomb_s (p: 443)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.22.7.3 La función wctomb (p: 358-359)
-
- K.3.6.4.1 La función wctomb_s (p: 610-611)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 7.20.7.3 La función wctomb (p: 322-323)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 4.10.7.3 La función wctomb
Véase también
|
convierte el siguiente carácter multibyte a carácter ancho
(función) |
|
|
(C95)
(C11)
|
convierte un carácter ancho a su representación multibyte, dado un estado
(función) |
|
Documentación de C++
para
wctomb
|
|