2012-07-02 13 views
19

me encontré con esto en el libro:¿Qué es una "cadena de caracteres anchos" en lenguaje C?

wscanf(L"%lf", &variable); 

en el que el primer parámetro es del tipo de wchar_t *.

Esto es diferente de scanf("%lf", &variable); donde el primer parámetro es del tipo char *.

¿Cuál es la diferencia que. Nunca antes había escuchado "cadenas de caracteres anchas". He escuchado algo llamado Raw String Literals que está imprimiendo la cadena tal como está (sin necesidad de cosas como secuencias de escape) pero no estaba en C.

+5

Empiece aquí http://www.joelonsoftware.com/articles/Unicode.html –

+3

El primer parámetro es realmente del tipo 'wchar_t []', sutilmente diferente de 'wchar_t *'. – dreamlax

Respuesta

29

La naturaleza exacta de los caracteres anchos es (a propósito) la implementación izquierda definida.

Cuando inventaron por primera vez el concepto de wchar_t, ISO 10646 y Unicode seguían compitiendo entre sí (mientras que ahora, en su mayoría cooperan). En lugar de intentar decretar que un personaje internacional sería uno u otro (o posiblemente algo completamente diferente), simplemente proporcionaron un tipo (y algunas funciones) que la implementación podría definir para admitir conjuntos de caracteres internacionales según lo que eligieran.

Diferentes implementaciones tienen ejercido ese potencial de variación. Por ejemplo, si usa el compilador de Microsoft en Windows, wchar_t será un tipo de 16 bits que contenga UTF-16 Unicode (originalmente contenía UCS-2 Unicode, pero ahora oficialmente está obsoleto).

En Linux, wchar_t suele ser un tipo de 32 bits que contiene Unicode codificado UCS-4/UTF-32. Los puertos de gcc al menos a algunos otros sistemas operativos hacen lo mismo, aunque nunca he intentado confirmar que siempre sea el caso.

Sin embargo, no hay garantía de eso. Al menos en teoría, una implementación en Linux podría usar 16 bits, o uno en Windows podría usar 32 bits, o cualquiera podría decidir usar 64 bits (aunque me sorprendería un poco ver eso en realidad).

En cualquier caso, la idea general de cómo son las cosas destinados a trabajar, es que una sola wchar_t es suficiente para representar un punto de código. Para E/S, los datos están destinados a convertirse desde la representación externa (lo que sea) en wchar_t s, lo que (se supone que) hace que sean relativamente fáciles de manipular. Luego, durante la salida, nuevamente se transforman en la codificación que elijas (que puede ser completamente diferente de la codificación que lees).

+0

¿qué pasa con otro unix que no sea Linux? Además, ¿no es esto una propiedad de glibc en lugar de Linux? –

+0

Como dije, no, no hay garantía de eso: "en teoría, una implementación en Linux podría usar 16 bits". En cuanto a Unix no Linux, no he buscado lo suficiente como para comentar de forma inteligente. –

7

"Cadena de caracteres anchos" hace referencia a la codificación de los caracteres la cuerda.

De Wikipedia:

un carácter ancho es un tipo de datos de carácter informático que generalmente tiene un tamaño mayor que el carácter tradicional de 8 bits. El tamaño de tipo de datos incrementado permite el uso de conjuntos de caracteres codificados más grandes.

UTF-16 es una de las codificaciones de caracteres anchos más utilizadas.

Además, wchar_t se define como Microsoft como un objeto de datos unsigned short(16-bit). Esta podría ser una definición muy diferente en otros sistemas operativos o idiomas.

Tomado del artículo de Wikipedia desde el comentario a continuación:.

"El ancho de wchar_t es su compilador y puede ser tan pequeño como 8 trozos consecuencia, los programas que necesitan ser portable a través de cualquier C o El compilador de C++ no debe usar wchar_t para almacenar texto Unicode. El tipowchar_t está destinado a almacenar caracteres anchos definidos por el compilador, que pueden ser caracteres Unicode en algunos compiladores. "

+1

Según Wikipedia, no es portátil: http://en.wikipedia.org/wiki/Wide_character – nhahtdh

+0

Gracias por la respuesta. – quantum231

+0

@ quantum231, la respuesta wiki es realmente cierta solo para MSFT. Lea la respuesta de Jerry y la publicación de blog Joel –

Cuestiones relacionadas