stringtranslate.com

Codificación de ancho variable

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 . [1] [a] Las codificaciones de ancho variable más comunes son codificaciones multibyte , que utilizan números variables de bytes ( octetos ) para codificar diferentes caracteres. (Algunos autores, especialmente en la documentación de Microsoft , utilizan el término juego de caracteres multibyte, que es un nombre inapropiado , porque el tamaño de 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 texto en inglés en menos bytes en juegos de aventuras para las primeras microcomputadoras . Sin embargo, los discos (que, a diferencia de las cintas, permitían el acceso aleatorio y permitían cargar texto bajo demanda), los aumentos en la memoria de la computadora y los algoritmos de compresión de propósito general han dejado estos trucos en gran medida obsoletos.

Las codificaciones multibyte suelen ser el resultado de la necesidad de aumentar la cantidad 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 compatible. ser factible en absoluto. [b]

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 de unidad única preexistentes, incluso mientras otros caracteres tienen múltiples unidades en sus códigos. El resultado es que hay tres tipos de unidades en una codificación de ancho variable: singletons , que constan de una sola unidad, unidades principales , que aparecen 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 otros programas generalmente no necesitan 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 de esta manera (mostrada como valores de bytes hexadecimales ): 49 E2 99 A5 4E 59 . De las seis unidades en esa secuencia, 49, 4E y 59 son unidades únicas (para I, N e Y ), E2 es una unidad líder y 99 y A5 son unidades de seguimiento. El símbolo del corazón está representado por la combinación de la unidad líder 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 más antiguas de ancho variable no suelen estar 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 principales o unidades de seguimiento, 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 múltiples unidades sea incorrecta. En una codificación de ancho variable donde los tres tipos de unidades están disjuntos, 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 sólo 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 conjuntos de caracteres grandes que superan con creces 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 separaron de los singleton mediante el uso de secuencias de escape ISO 2022 para cambiar entre el modo de un solo byte y el modo multibyte. Al principio se podían codificar un total de 8.836 (94×94) caracteres y, conmutando, se podían codificar más conjuntos de 94×94 caracteres. 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 hacen 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 multiunitarias y los singleton con secuencias de escape, lo que hacía que las codificaciones tuvieran estado, las secuencias multiunitarias se marcaban por tener el conjunto de bits más significativo, es decir, estar en el rango 80-FF (hexadecimal), mientras que los singleton eran solo en el rango 00–7F. Las unidades principales y las unidades de seguimiento estaban en el rango A1 a FE (hexadecimal), es decir, el mismo rango en las codificaciones ISO 2022, pero con el bit alto establecido en 1. Era razonablemente fácil trabajar con estas codificaciones siempre que todas sus delimitadores eran caracteres ASCII y evitó truncar cadenas a longitudes fijas, pero una interrupción en medio de un carácter multibyte aún podría causar una corrupción importante.

En la PC ( plataformas DOS y Microsoft Windows ), se establecieron dos codificaciones para japonés y chino tradicional en las que todos los singletons, unidades principales y unidades de seguimiento se superponían: Shift-JIS y Big5 respectivamente. En Shift-JIS, las unidades líderes tenían el rango 81–9F y E0–FC, las unidades de seguimiento tenían el rango 40–7E y 80–FC, y las unidades únicas tenían el rango 21–7E y A1–DF. En Big5, las unidades líderes tenían el rango A1-FE, las unidades de seguimiento tenían el rango 40-7E y A1-FE, y las unidades únicas tenían el rango 21-7E (todos los valores en hexadecimal). Esta superposición volvió a dificultar el procesamiento, aunque al menos la mayoría de los símbolos tenían valores de bytes únicos (aunque curiosamente 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, tanto el estándar Unicode como el ISO 10646 estaban destinados a tener un ancho fijo, siendo Unicode de 16 bits e ISO 10646 de 32 bits. [ cita necesaria ] 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 de seguimiento 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 , el primero en implementar Unicode en su totalidad, lo abandonaron y lo reemplazaron con una codificación de ancho variable para Unicode mucho mejor diseñada. : 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 seguimiento tienen el rango 80–BF. La unidad líder también indica cuántas unidades de seguimiento le siguen: una después de C2–DF, dos después de E0–EF y tres después de F0–F4. [C]

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 de seguimiento, denominadas sustitutos altos y sustitutos bajos , respectivamente, en la terminología Unicode, asignan 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 sustitutos alto y bajo) puntos de código codificables. , o valores escalares en lenguaje Unicode (los sustitutos no se pueden codificar).

Ver también

Notas

  1. ^ Sin embargo, el concepto precede mucho a la llegada de la computadora electrónica, como se ve con el código Morse .
  2. ^ Como ejemplo de esto en la vida real, UTF-16 , que representa los caracteres más comunes exactamente de la manera que se acaba de describir (y utiliza pares de unidades de código de 16 bits para caracteres menos comunes) nunca ganó fuerza como codificación de texto. destinado al intercambio debido a su incompatibilidad con la omnipresente codificación ASCII de 7/8 bits , y su función prevista la asume UTF-8 , que preserva la compatibilidad ASCII.
  3. ^ En la versión original de UTF-8, desde su publicación en 1992 hasta que su espacio de código se restringió al de UTF-16 en 2003, el rango de unidades principales que codificaban secuencias finales de tres unidades era mayor (F0-F7); Además, las unidades líderes F8 – FB fueron seguidas por cuatro unidades de seguimiento y FC – FD por cinco. FE-FF nunca fueron unidades líderes o de seguimiento válidas en ninguna versión de UTF-8.

Referencias

  1. ^ Crispin, M. (1 de abril de 2005). Formatos de transformación eficiente UTF-9 y UTF-18 de Unicode . doi :10.17487/rfc4042.