2011-09-26 10 views
15

El nuevo estándar C++ 11 menciona un encabezado <cuchar>, presumiblemente en analogía al C99 <uchar.h>.¿Qué proporciona `<cuchar>` y dónde está documentado?

Ahora, sabemos que C++ 11 trae new character types and literals que están específicamente diseñados para UTF16 y UTF32, pero no creo que el lenguaje en realidad contenga funciones para convertir la codificación de multibyte estrecha (dependiente del sistema) a una de las codificaciones Unicode. Sin embargo, me encontré con la sinopsis del encabezado para <cuchar> que menciona las funciones mbrtoc16/c16rtombr y mbrtoc32/c32rtombr que parecen hacer precisamente eso.

Desafortunadamente, la norma no dice nada sobre esas funciones más allá de la sinopsis del encabezado. ¿Dónde están definidas esas funciones, qué hacen realmente y dónde puedo leer más sobre ellas? ¿Esto significa que ahora se puede usar Unicode adecuado completamente con C++ estándar, sin la necesidad de bibliotecas adicionales?

+0

En el estándar C? –

+0

@ R.MartinhoFernandes: No tengo eso - ¿tiene algún detalle? ¿Incluso solo referencias web? –

+0

Vaya, parece que no puedo encontrarlos en el último borrador C99 (N1124). De hecho, no puedo encontrar ninguna mención 'uchar.h'. –

Respuesta

5

Se describieron en un WG21 paper from 2005 pero la descripción no está presente en el estándar final. Están documentados en ISO/IEC 19769: 2004 (Extensiones para el lenguaje de programación C para admitir nuevos tipos de datos de caracteres) (draft), que se refiere a la norma C++ 11.

El texto es demasiado largo para publicar aquí, pero estas son las firmas:

size_t mbrtoc16(char16_t * pc16, const char * s, size_t n, mbstate_t * ps); 
size_t c16rtomb(char * s, char16_t c16, mbstate _t * ps); 
size_t mbrtoc32(char32_t * pc32, const char * s, size_t n, mbstate_t * ps); 
size_t c32rtomb(char * s, char32_t c32, mbstate_t * ps); 

Las funciones de conversión entre caracteres de varios bytes y UTF-16 o UTF-32 caracteres, respectivamente, similar a mbrtowc. No hay versiones no reentrantes, y honestamente, ¿quién las necesita?

+0

¿Lo tiene en el FDIS (tabla 79)? –

+0

@KerrekSB El FDIS solo incluye la tabla con los nombres. Editar: ¡los encontré! –

+0

Gracias por la actualización: ¿hay documentación sobre qué se supone que deben hacer y cómo se operan? ¿Es exactamente como 'mbsrtowcs'? (Interesante por la forma en que solo hay una versión reentrante.) * Editar: * Oh, no, espera, es como 'mbrtowc'. No cadenas, solo caracteres individuales. –

1

Probablemente la mejor documentación de la que tengo conocimiento está en n1326, la propuesta de agregar TR19769 a la biblioteca estándar C [Editar: aunque lo mire, el N1010 que R. Martinho Fernandes citó parece tener casi el mismo].

+0

Gracias ... aunque ahora siento que entiendo * menos *. ¿Qué hay de esas macros? ¿Afectan cómo el compilador traduce las codificaciones? Hmmmm .... –

+0

@ R.MartinhoFernandes: No de acuerdo con el documento vinculado. Dice que ** si ** las macros están definidas, entonces 'char32_t' está codificado en UTF32; * de lo contrario * la codificación está definida por la implementación. ¿Eso significa que si configuro la macro, el compilador debe producir UTF32, pero de lo contrario no? –

+2

@KerrekSB Parece que el estándar C++ 11 requiere literales de caracteres y cadenas de 'char16_t' y' char32_t' para ser UTF-16 y UTF-32, por lo que en C++ las macros deberían definirse, supongo. –

Cuestiones relacionadas