Codificación de ancho variable - Variable-width encoding

Una codificación de ancho variable es un tipo de esquema de codificación de caracteres en el que se utilizan códigos de diferentes longitudes para codificar un conjunto de caracteres (un repertorio de símbolos) para su representación, generalmente en una computadora . Las codificaciones de ancho variable más comunes son codificaciones multibyte , que utilizan diferentes números de bytes ( octetos ) para codificar diferentes caracteres. (Algunos autores, sobre todo en la documentación de Microsoft, utilizan el término juego de caracteres multibyte, que es un nombre inapropiado , porque el tamaño de la representación es un atributo de la codificación, no del juego de caracteres).

Las primeras codificaciones de ancho variable que usaban menos de un byte por carácter a veces se usaban para empaquetar el texto en inglés en menos bytes en los juegos de aventuras para las primeras microcomputadoras . Sin embargo, los discos (que a diferencia de las cintas permitían el acceso aleatorio que permitía cargar texto a pedido), los aumentos en la memoria de la computadora y los algoritmos de compresión de propósito general han hecho que estos trucos sean en gran parte obsoletos.

Las codificaciones multibyte suelen ser el resultado de la necesidad de aumentar el número de caracteres que se pueden codificar sin romper la compatibilidad con versiones anteriores de una restricción existente. Por ejemplo, con un byte (8 bits) por carácter, se pueden codificar 256 caracteres posibles; Para codificar más de 256 caracteres, la opción obvia sería utilizar dos o más bytes por unidad de codificación, dos bytes (16 bits) permitirían 65.536 caracteres posibles, pero tal cambio rompería la compatibilidad con los sistemas existentes y, por lo tanto, podría no ser factible en absoluto.

Estructura general

Dado que el objetivo de un sistema de codificación multibyte es minimizar los cambios en el software de aplicación existente, algunos caracteres deben conservar sus códigos preexistentes de una sola unidad, incluso mientras que otros caracteres tienen varias unidades en sus códigos. El resultado es que hay tres tipos de unidades en una codificación de ancho variable: singletons , que consisten en una sola unidad, unidades principales , que vienen primero en una secuencia de múltiples unidades , y unidades de seguimiento , que vienen después en una secuencia de múltiples unidades . El software de entrada y visualización obviamente necesita conocer la estructura del esquema de codificación multibyte, pero otro software generalmente no necesita saber si un par de bytes representan dos caracteres separados o solo un carácter.

Por ejemplo, la cadena de cuatro caracteres " I ♥ NY " está codificada en UTF-8 así (mostrada como valores de bytes hexadecimales ): 49 E2 99 A5 4E 59 . De las seis unidades en esa secuencia, 49 , 4E y 59 son singletons (para I, N e Y ), E2 es una unidad principal y 99 y A5 son unidades finales. El símbolo del corazón está representado por la combinación de la unidad principal y las dos unidades de seguimiento.

UTF-8 facilita que un programa identifique los tres tipos de unidades, ya que se encuentran en rangos de valores separados. Las codificaciones de ancho variable más antiguas generalmente no están tan bien diseñadas, ya que los rangos pueden superponerse. Una aplicación de procesamiento de texto que se ocupa de la codificación de ancho variable debe escanear el texto desde el principio de todas las secuencias definitivas para identificar las distintas unidades e interpretar el texto correctamente. En tales codificaciones, es probable que se encuentren falsos positivos al buscar una cadena en medio del texto. Por ejemplo, si los valores hexadecimales DE, DF, E0 y E1 pueden ser unidades iniciales o unidades finales, entonces una búsqueda de la secuencia de dos unidades DF E0 puede producir un falso positivo en la secuencia DE DF E0 E1, que consta de dos secuencias consecutivas de dos unidades. También existe el peligro de que una sola unidad dañada o perdida pueda hacer que toda la interpretación de una gran serie de secuencias de varias unidades sea incorrecta. En una codificación de ancho variable donde los tres tipos de unidades están disyuntos, la búsqueda de cadenas siempre funciona sin falsos positivos y (siempre que el decodificador esté bien escrito) la corrupción o pérdida de una unidad corrompe solo un carácter.

Codificaciones multibyte CJK

El primer uso de codificaciones multibyte fue para la codificación de chino, japonés y coreano, que tienen grandes conjuntos de caracteres que superan los 256 caracteres. Al principio, la codificación se limitó al límite de 7 bits. Las codificaciones ISO-2022-JP, ISO-2022-CN e ISO-2022-KR utilizaron el rango 21–7E (hexadecimal) tanto para las unidades principales como para las unidades de seguimiento, y las distinguieron de los singleton mediante el uso de secuencias de escape ISO 2022 para cambiar entre el modo de un solo byte y multibyte. Al principio, se podrían codificar un total de 8.836 (94 × 94) caracteres y más conjuntos de 94 × 94 caracteres con conmutación. Los esquemas de codificación ISO 2022 para CJK todavía se utilizan en Internet. La naturaleza con estado de estas codificaciones y la gran superposición las hace muy difíciles de procesar.

En las plataformas Unix , las codificaciones ISO 2022 de 7 bits fueron reemplazadas por un conjunto de esquemas de codificación de 8 bits, el Código Unix Extendido: EUC-JP, EUC-CN y EUC-KR. En lugar de distinguir entre las secuencias de unidades múltiples y los singleton con secuencias de escape, lo que hacía que las codificaciones tuvieran estado, las secuencias de unidades múltiples se marcaron teniendo el conjunto de bits más significativo, es decir, en el rango 80-FF (hexadecimal), mientras que los singleton eran en el rango de 00–7F solo. Las unidades principales y las unidades de seguimiento estaban en el rango de A1 a FE (hexadecimal), es decir, el mismo que su rango en las codificaciones ISO 2022, pero con el bit alto establecido en 1. Estas codificaciones eran razonablemente fáciles de trabajar con todas las sus delimitadores eran caracteres ASCII y evitó truncar cadenas a longitudes fijas, pero una ruptura en el medio de un carácter multibyte podría causar daños importantes.

En la PC ( plataformas DOS y Microsoft Windows ), se establecieron dos codificaciones para el japonés y el chino tradicional en las que todos los singleton, las unidades principales y las unidades de seguimiento se superponían: Shift-JIS y Big5 respectivamente. En Shift-JIS, las unidades principales tenían el rango 81–9F y E0 – FC, las unidades de seguimiento tenían el rango 40–7E y 80 – FC, y los singleton tenían el rango 21–7E y A1 – DF. En Big5, las unidades principales tenían el rango A1 – FE, las unidades de seguimiento tenían el rango 40–7E y A1 – FE, y los singleton tenían el rango 21–7E (todos los valores en hexadecimal). Esta superposición nuevamente hizo que el procesamiento fuera complicado, aunque al menos la mayoría de los símbolos tenían valores de bytes únicos (aunque, extrañamente, la barra invertida no los tiene).

Codificaciones Unicode de ancho variable

El estándar Unicode tiene dos codificaciones de ancho variable: UTF-8 y UTF-16 (también tiene una codificación de ancho fijo, UTF-32 ). Originalmente, los estándares Unicode e ISO 10646 estaban destinados a ser de ancho fijo, siendo Unicode de 16 bits e ISO 10646 de 32 bits. ISO 10646 proporcionó una codificación de ancho variable llamada UTF-1 , en la que los singleton tenían el rango 00–9F, las unidades principales el rango A0 – FF y las unidades finales los rangos A0 – FF y 21–7E. Debido a este mal diseño, similar a Shift JIS y Big5 en su superposición de valores, los inventores del sistema operativo Plan 9 , los primeros en implementar Unicode, lo abandonaron y lo reemplazaron con una codificación de ancho variable mucho mejor diseñada para Unicode. : UTF-8, en el que los singleton tienen el rango 00–7F, las unidades principales tienen el rango C0 – FD (ahora en realidad C2 – F4, para evitar secuencias demasiado largas y mantener el sincronismo con la capacidad de codificación de UTF-16; consulte UTF -8 artículo), y las unidades de camino tienen un rango de 80 – BF. La unidad principal también indica cuántas unidades de camino siguen: una después de C2 – DF, dos después de E0 – EF y tres después de F0 – F4.

UTF-16 se diseñó para liberarse del límite de 65.536 caracteres del Unicode original (1.x) sin romper la compatibilidad con la codificación de 16 bits. En UTF-16, los singleton tienen el rango 0000 – D7FF (55,296 puntos de código) y E000 – FFFF (8192 puntos de código, 63,488 en total), las unidades principales el rango D800 – DBFF (1024 puntos de código) y las unidades de seguimiento el rango DC00– DFFF (1024 puntos de código, 2048 en total). Las unidades principales y finales, denominadas sustitutos altos y sustitutos bajos , respectivamente, en terminología Unicode, mapean 1024 × 1024 o 1.048.576 caracteres suplementarios, lo que genera 1.112.064 (63.488 puntos de código BMP + 1.048.576 puntos de código representados por pares de sustitutos altos y bajos) puntos de código codificables. , o valores escalares en el lenguaje Unicode (los sustitutos no son codificables).

Ver también

Notas

Referencias