¿Qué es una "cadena de caracteres anchos" en lenguaje C?
string widechar (2)
"Cadena de caracteres anchos" se refiere a la codificación de los caracteres en la cadena.
De Wikipedia :
Un carácter ancho es un tipo de datos de caracteres de computadora que generalmente tiene un tamaño mayor que el carácter tradicional de 8 bits. El aumento del tamaño del tipo de datos 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
es definido por Microsoft como un objeto de datos unsigned short(16-bit)
. Esta podría ser y es muy probablemente una definición diferente en otros sistemas operativos o idiomas.
Tomado del artículo de Wikipedia del comentario a continuación:
"El ancho de wchar_t es específico del compilador y puede ser tan pequeño como 8 bits. En consecuencia, los programas que deben ser portátiles en cualquier compilador C o C ++ no deben usar wchar_t para almacenar texto Unicode. El tipo wchar_t está diseñado para almacenar compilador- Caracteres anchos definidos, que pueden ser caracteres Unicode en algunos compiladores ".
Me encontré con esto en el libro:
wscanf(L"%lf", &variable);
donde el primer parámetro es de tipo wchar_t *
.
Esto es diferente de scanf("%lf", &variable);
donde el primer parámetro es de tipo char *
.
Entonces, ¿cuál es la diferencia que. Nunca he escuchado "cadena de caracteres de ancho" antes. He escuchado algo llamado Raw String Literals que está imprimiendo la cadena tal como está (no hay necesidad de cosas como secuencias de escape) pero eso no estaba en C.
La naturaleza exacta de los caracteres anchos se deja (a propósito) de implementación 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 tratar de decretar que un carácter internacional sería uno u otro (o posiblemente algo completamente), simplemente proporcionaron un tipo (y algunas funciones) que la implementación podría definir para respaldar los conjuntos de caracteres internacionales según lo elijan.
Diferentes implementaciones han ejercido ese potencial de variación. Por ejemplo, si usa el compilador de Microsoft en Windows, wchar_t
será un tipo de 16 bits con UTF-16 Unicode (originalmente tenía UCS-2 Unicode, pero ahora está oficialmente obsoleto).
En Linux, wchar_t
será más a menudo un tipo de 32 bits, que contiene Unicode codificado UCS-4 / UTF-32. Los puertos de gcc al menos a otros sistemas operativos hacen lo mismo, aunque nunca he intentado confirmar que siempre es así.
Sin embargo, no hay garantía de eso. Al menos en teoría, una implementación en Linux podría usar 16 bits, o una en Windows podría usar 32 bits, o cualquiera de los dos 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 se pretende que funcionen las cosas, es que un solo wchar_t
es suficiente para representar un punto de código. Para I / O, los datos están destinados a convertirse desde la representación externa (sea lo que sea) en wchar_t
s, lo que (se supone que debe) los hace relativamente fáciles de manipular. Luego, durante la salida, nuevamente se transforman en la codificación de su elección (que puede ser completamente diferente de la codificación que lea).