Un carácter ancho es un tipo de datos de caracteres informáticos que, por lo general, tiene un tamaño mayor que el carácter tradicional de 8 bits . El mayor tamaño del tipo de datos permite el uso de conjuntos de caracteres codificados más grandes .
Durante la década de 1960, los fabricantes de mainframes y minicomputadoras comenzaron a estandarizar el byte de 8 bits como su tipo de datos más pequeño. El conjunto de caracteres ASCII de 7 bits se convirtió en el método estándar de la industria para codificar caracteres alfanuméricos para máquinas de teletipo y terminales de computadora . El bit adicional se utilizó para la paridad, para garantizar la integridad del almacenamiento y la transmisión de datos. Como resultado, el byte de 8 bits se convirtió en el tipo de datos de facto para los sistemas informáticos que almacenaban caracteres ASCII en la memoria.
Más tarde, los fabricantes de computadoras comenzaron a utilizar el bit de repuesto para ampliar el conjunto de caracteres ASCII más allá de su conjunto limitado de caracteres del alfabeto inglés . Las extensiones de 8 bits como la página de códigos 37 de IBM, PETSCII e ISO 8859 se volvieron comunes, ofreciendo soporte de terminal para griego , cirílico y muchos otros. Sin embargo, dichas extensiones aún estaban limitadas porque eran específicas de la región y, a menudo, no se podían usar en tándem. Se debían usar rutinas de conversión especiales para convertir de un conjunto de caracteres a otro, lo que a menudo resultaba en una traducción destructiva cuando no existía ningún carácter equivalente en el conjunto de destino.
En 1989, la Organización Internacional de Normalización comenzó a trabajar en el conjunto de caracteres universal (UCS), un conjunto de caracteres multilingüe que podía codificarse utilizando un valor de 16 bits (2 bytes) o de 32 bits (4 bytes). Estos valores más grandes requerían el uso de un tipo de datos mayor que 8 bits para almacenar los nuevos valores de caracteres en la memoria. Por ello, se utilizó el término carácter ancho para diferenciarlos de los tipos de datos de caracteres tradicionales de 8 bits.
Un carácter ancho se refiere al tamaño del tipo de datos en la memoria. No indica cómo se define cada valor en un conjunto de caracteres. En cambio, esos valores se definen mediante conjuntos de caracteres, siendo UCS y Unicode simplemente dos conjuntos de caracteres comunes que codifican más caracteres de los que permitiría un valor numérico de 8 bits de ancho (255 en total).
De la misma forma que los sistemas de transmisión de datos anteriores carecían de una ruta de datos limpia de 8 bits , los sistemas de transmisión modernos a menudo carecen de compatibilidad con rutas de datos de 16 o 32 bits para datos de caracteres. Esto ha dado lugar a sistemas de codificación de caracteres como UTF-8 , que pueden utilizar varios bytes para codificar un valor que es demasiado grande para un único símbolo de 8 bits.
El estándar C distingue entre codificaciones multibyte de caracteres, que utilizan un número fijo o variable de bytes para representar cada carácter (utilizados principalmente en el código fuente y archivos externos), y caracteres anchos , que son representaciones en tiempo de ejecución de caracteres en objetos individuales (normalmente, más de 8 bits).
La adopción temprana de UCS-2 ("Unicode 1.0") condujo al uso común de UTF-16 en varias plataformas, más notablemente Microsoft Windows , .NET y Java . En estos sistemas, es común tener un tipo de "carácter ancho" ( wchar_t
en C/C++; char
en Java) de 16 bits. Estos tipos no siempre se asignan directamente a un "carácter", ya que se requieren pares sustitutos para almacenar el rango completo de Unicode (1996, Unicode 2.0). [1] [2] [3]
Los sistemas tipo Unix generalmente utilizan 32 bits wchar_t
para adaptarse al punto de código Unicode de 21 bits, como prescribe C90. [4]
El tamaño de un tipo de carácter ancho no dicta qué tipo de codificaciones de texto puede procesar un sistema, ya que existen conversiones. (Sin embargo, los códigos de conversión antiguos suelen pasar por alto los sustitutos). Las circunstancias históricas de su adopción también deciden qué tipos de codificación prefieren . Un sistema influenciado por Unicode 1.0, como Windows, tiende a utilizar principalmente "cadenas anchas" formadas por unidades de caracteres anchos. Sin embargo, otros sistemas, como los similares a Unix, tienden a conservar la convención de "cadena estrecha" de 8 bits, utilizando una codificación multibyte (casi universalmente UTF-8) para manejar caracteres "anchos". [5]
Las bibliotecas estándar de C y C++ incluyen una serie de funciones para trabajar con caracteres anchos y cadenas compuestas por ellos. Los caracteres anchos se definen utilizando el tipo de datos wchar_t
, que en el estándar C90 original se definía como
Tanto C como C++ introdujeron tipos de caracteres de tamaño fijo char16_t
y, en las revisiones de 2011 de sus respectivos estándares, proporcionaron una representación inequívoca de los formatos de transformación Unicodechar32_t
de 16 y 32 bits , dejando la definición de la implementación. El estándar Unicode 4.0 ISO/IEC 10646:2003 dice que:wchar_t
wchar_t
es específico del compilador y puede ser tan pequeño como 8 bits. En consecuencia, los programas que necesitan ser portables a través de cualquier compilador C o C++ no deberían usarlo wchar_t
para almacenar texto Unicode. El wchar_t
tipo está pensado para almacenar caracteres anchos definidos por el compilador, que pueden ser caracteres Unicode en algunos compiladores". [6]Según la documentación de Python 2.7, el lenguaje a veces utiliza wchar_t
como base para su tipo de carácter Py_UNICODE
. Depende de si wchar_t
es "compatible con la variante de compilación de Unicode de Python elegida" en ese sistema. [7] Esta distinción ha quedado obsoleta desde Python 3.3, que introdujo un almacenamiento UCS1/2/4 de tamaño flexible para cadenas y se Py_UNICODE
le asignó formalmente el alias wchar_t
. [8] Desde Python 3.12, el uso de wchar_t
, es decir, el Py_UNICODE
typedef , para cadenas de Python (wstr en la implementación) se ha abandonado y sigue siendo como antes una " representación UTF-8 se crea a pedido y se almacena en caché en el objeto Unicode". [9]
En los años siguientes, muchos sistemas añadieron compatibilidad con Unicode y cambiaron a la codificación UCS-2. Esta codificación resultó especialmente atractiva para las nuevas tecnologías, como el marco Qt (1992), Windows NT 3.1 (1993) y Java (1995).
{{cite book}}
: Mantenimiento de CS1: otros ( enlace )