2.2.1a1 El carácter ancho
§1 Introducción
Respecto al problema someramente esbozado en el apartado anterior ( 2.2.1a), de representar los caracteres de lenguas distintas del inglés americano. En los compiladores C y C++ se decidió utilizar un nuevo tipo, denominado carácter ancho o DBCS ("Double Byte Character Set"), en atención a que como veremos a continuación, la mayoría de las veces ocupa dos Bytes.
El carácter ancho se designa con la palabra wchar_t. En C se utilizó un typdef ( 3.2.1a, <stddef.h>) para definirlo, pero en C++ tomó carta de naturaleza como un nuevo tipo preconstruido en el lenguaje, de forma que de ser un typedef pasó a ser palabra clave.
§2 wchar_t
En C++ esta palabra clave identifica un tipo especial, el carácter ancho.
Sintaxis:
wchar_t <identificador>;
Comentario
El Estándar C++ nos dice que su tamaño es dependiente de la implementación, pero que debe ser suficiente para almacenar el juego de caracteres mayor que soporte el compilador. Como actualmente el juego de caracteres internacional es Unicode ( 2.2.1a2) que utiliza 2 bytes, este es el tamaño mínimo del wchar_t de la mayoría de compiladores.
Nota: en el caso de Borland C++ es del mismo tamaño, signo y alineación que el tipo int, es decir 4 bytes (un wchar_t C es de solo 2 bytes), mientras que el wchar_t de MS Visual C++ es de 2 bytes.
Tenga en cuenta, que la librería Estándar C++ utiliza funciones
distintas para manejar caracteres anchos y normales. Por ejemplo,
la función printf para caracteres tipo char, tiene una
versión wprintf cuando se trata de representar caracteres tipo wchar_t;
a su vez, strlen ("string length") tiene la versión wcslen
("wide-character string length") para caracteres anchos. wcout
es la versión de cout para caracteres anchos. Etc. (existen dos
versiones de todas aquellas funciones que manejan cadenas alfanuméricas).
Ejemplos
wchar_t ch; // declaración de carácter ancho
wchar_t* str = L"ABCD"; // puntero a cadena de caracteres anchos
wcout << "La cadena es: " << str << endl; // L.3
wcout << L"La cadena es: " << str << endl; // L.4
wchar_t cnulo = L'\0' // carácter nulo ancho
Comentario:
Las sentencias L.3 y L.4 son equivalentes; la salida en ambos casos es:
La cadena es: ABCD
Observe que en L.3 el compilador es suficientemente inteligente para suponer que el literal "La cadena es: " es de caracteres anchos.