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, normalmente en una computadora . [1] [a] Las codificaciones de ancho variable más comunes son las codificaciones multibyte , que utilizan un número variable de bytes ( octetos ) para codificar diferentes caracteres. (Algunos autores, en particular en la documentación de Microsoft , utilizan el término conjunto 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 conjunto de caracteres).

Las primeras codificaciones de ancho variable que utilizaban menos de un byte por carácter se usaban a veces para comprimir texto en inglés en menos bytes en los juegos de aventura para las primeras microcomputadoras . Sin embargo, los discos (que a diferencia de las cintas permitían un acceso aleatorio que permitía cargar texto a demanda), los aumentos en la memoria de las computadoras y los algoritmos de compresión de propósito general han hecho que estos trucos queden en gran medida 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 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 un cambio de este tipo rompería la compatibilidad con los sistemas existentes y, por lo tanto, podría no 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 que 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: unidades singleton , que consisten en una sola unidad, unidades de cabecera , que vienen primero en una secuencia de múltiples unidades, y unidades de cola , 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 la siguiente manera (mostrada como valores de bytes hexadecimales ): 49 E2 99 A5 4E 59. De las seis unidades de esa secuencia, 49, 4E y 59 son unidades únicas (para I, N e Y ), E2 es una unidad principal y 99 y A5 son unidades secundarias. El símbolo del corazón está representado por la combinación de la unidad principal y las dos unidades secundarias.

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 no suelen estar tan bien diseñadas, ya que los rangos pueden superponerse. Una aplicación de procesamiento de texto que trabaje con 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 dichas 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 secundarias, 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 solo un carácter.

Codificaciones multibyte CJK

El primer uso de las 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 utilizaban el rango 21–7E (hexadecimal) tanto para las unidades iniciales como para las unidades finales, y las diferenciaban de las unidades individuales mediante 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 otros 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 hacen que sea muy difícil procesarlas.

En las plataformas Unix , las codificaciones de 7 bits ISO 2022 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 singletons con secuencias de escape, lo que hizo que las codificaciones tuvieran estado, las secuencias multiunitarias se marcaron al tener el bit más significativo establecido, es decir, estando en el rango 80-FF (hexadecimal), mientras que los singletons estaban en el rango 00-7F solo. Las unidades de avance y las unidades de seguimiento estaban en el rango A1 a FE (hexadecimal), es decir, el mismo rango que su rango en las codificaciones ISO 2022, pero con el bit alto establecido en 1. Estas codificaciones eran razonablemente fáciles de trabajar siempre que todos los delimitadores fueran caracteres ASCII y se evitara truncar cadenas a longitudes fijas, pero una ruptura en el medio de un carácter multibyte aún podí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 símbolos singleton, unidades principales y unidades finales 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 finales tenían el rango 40–7E y 80–FC, y los símbolos singleton tenían el rango 21–7E y A1–DF. En Big5, las unidades principales tenían el rango A1–FE, las unidades finales tenían el rango 40–7E y A1–FE, y los símbolos singleton tenían el rango 21–7E (todos los valores en hexadecimal). Esta superposición volvió a complicar el procesamiento, aunque al menos la mayoría de los símbolos tenían valores de byte ú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, 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 requerida ] ISO 10646 proporcionó una codificación de ancho variable llamada UTF-1 , en la que los singletons tenían el rango 00–9F, las unidades principales el rango A0–FF y las unidades posteriores 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 mucho mejor diseñada para Unicode: UTF-8, en la que los singletons 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 el artículo UTF-8 ), y las unidades posteriores tienen el rango 80–BF. La unidad principal también indica cuántas unidades posteriores 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 romper con el 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 singletons 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 de cabecera el rango D800–DBFF (1024 puntos de código) y las unidades de cola el rango DC00–DFFF (1024 puntos de código, 2048 en total). Las unidades líder y final, llamadas sustitutos altos y sustitutos bajos , respectivamente, en la terminología Unicode, asignan 1024×1024 o 1.048.576 caracteres suplementarios, lo que da como resultado 1.112.064 (63.488 puntos de código BMP + 1.048.576 puntos de código representados por pares sustitutos altos y bajos) puntos de código codificables, o valores escalares en el lenguaje Unicode (los sustitutos no son codificables).

Véase también

Notas

  1. ^ Sin embargo, el concepto precede por mucho tiempo a la llegada de la computadora electrónica, como se ve con el código Morse .
  2. ^ Como ejemplo real de esto, 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 para texto destinado al intercambio debido a su incompatibilidad con la omnipresente codificación ASCII de 7/8 bits ; su función prevista la asumió UTF-8 , que preserva la compatibilidad con 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 principales F8–FB eran seguidas por cuatro unidades finales, y las FC–FD por cinco. FE–FF nunca fueron unidades principales o finales válidas en ninguna versión de UTF-8.

Referencias

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