Codificación de caracteres - Character encoding

Cinta perforada con la palabra "Wikipedia" codificada en ASCII . La presencia y ausencia de un agujero representa 1 y 0, respectivamente; por ejemplo, "W" se codifica como "1010111".

En informática , almacenamiento de datos y transmisión de datos , la codificación de caracteres se utiliza para representar un repertorio de caracteres mediante algún tipo de sistema de codificación que asigna un número a cada carácter para su representación digital. Dependiendo del nivel de abstracción y el contexto, los puntos de código correspondientes y el espacio de código resultante pueden considerarse patrones de bits , octetos , números naturales , pulsos eléctricos o cualquier cosa similar. La codificación de caracteres se utiliza en el cálculo , el almacenamiento de datos y la transmisión de datos textuales. "Conjunto de caracteres", "mapa de caracteres", "conjunto de códigos " y " página de códigos " son términos relacionados, pero no idénticos.

Los primeros códigos de caracteres asociados con el telégrafo óptico o eléctrico solo podían representar un subconjunto de los caracteres utilizados en los idiomas escritos , a veces restringidos a letras mayúsculas , números y solo algunos signos de puntuación . El bajo costo de la representación digital de datos en los sistemas informáticos modernos permite códigos de caracteres más elaborados (como Unicode ) que representan la mayoría de los caracteres utilizados en muchos lenguajes escritos. La codificación de caracteres que utiliza estándares aceptados internacionalmente permite el intercambio de texto en formato electrónico en todo el mundo.

Historia

La historia de los códigos de caracteres ilustra la necesidad creciente de información simbólica basada en caracteres mediada por máquinas a distancia, utilizando medios eléctricos que alguna vez fueron novedosos. Los primeros códigos se basaban en sistemas de codificación y cifrado manuales y escritos a mano, como el cifrado de Bacon , Braille , banderas de señales marítimas internacionales y la codificación de 4 dígitos de caracteres chinos para un código telegráfico chino ( Hans Schjellerup , 1869). Con la adopción de técnicas eléctricas y electromecánicas, estos primeros códigos se adaptaron a las nuevas capacidades y limitaciones de las primeras máquinas. El código de caracteres transmitido eléctricamente más antiguo, el código Morse , introducido en la década de 1840, utilizaba un sistema de cuatro "símbolos" (señal corta, señal larga, espacio corto, espacio largo) para generar códigos de longitud variable. Aunque parte del uso comercial del código Morse se realizó a través de maquinaria, a menudo se usaba como código manual, generado a mano en una tecla de telégrafo y descifrable de oído, y persiste en radioaficionados y uso aeronáutico . La mayoría de los códigos tienen una longitud fija por carácter o secuencias de longitud variable de códigos de longitud fija (por ejemplo, Unicode ).

Los ejemplos comunes de sistemas de codificación de caracteres incluyen el código Morse , el código Baudot , el Código estándar americano para el intercambio de información ( ASCII ) y Unicode . Unicode , un sistema de codificación extensible y bien definido, ha suplantado a la mayoría de las codificaciones de caracteres anteriores, pero el camino del desarrollo del código hasta el presente es bastante conocido.

El código Baudot , una codificación de cinco bits, fue creado por Émile Baudot en 1870, patentado en 1874, modificado por Donald Murray en 1901 y estandarizado por el CCITT como Alfabeto Telegráfico Internacional No. 2 (ITA2) en 1930. El nombre "baudot "se ha aplicado erróneamente a ITA2 y sus muchas variantes. ITA2 adolecía de muchas deficiencias y, a menudo, muchos fabricantes de equipos lo "mejoraban", lo que a veces creaba problemas de compatibilidad. En 1959, el ejército de EE. UU. Definió su código Fieldata , un código de seis o siete bits, introducido por el Cuerpo de Señales del Ejército de EE. UU. Si bien Fieldata abordó muchos de los problemas entonces modernos (por ejemplo, códigos de letras y dígitos dispuestos para la clasificación de la máquina), Fieldata no alcanzó sus objetivos y fue de corta duración. En 1963, el primer código ASCII (Código estándar americano para el intercambio de información) fue publicado (X3.4-1963) por el comité ASCII (que incluía al menos a un miembro del comité Fieldata, WF Leubbert) que abordó la mayoría de las deficiencias de Fieldata. , usando un código más simple. Muchos de los cambios fueron sutiles, como conjuntos de caracteres que se pueden comparar dentro de ciertos rangos numéricos. ASCII63 fue un éxito, ampliamente adoptado por la industria, y con la edición de seguimiento del código ASCII de 1967 (que agregó letras minúsculas y solucionó algunos problemas de "código de control"), ASCII67 fue adoptado de manera bastante generalizada. La naturaleza centrada en Estados Unidos de ASCII67 se abordó de alguna manera en el estándar europeo ECMA-6 .

Tarjeta perforada Hollerith de 80 columnas con juego de caracteres EBCDIC

Herman Hollerith inventó la codificación de datos de tarjetas perforadas a fines del siglo XIX para analizar los datos del censo. Inicialmente, la posición de cada agujero representaba un elemento de datos diferente, pero luego, la información numérica se codificó numerando las filas inferiores del 0 al 9, con un punzón en una columna que representaba su número de fila. Los datos alfabéticos posteriores se codificaron permitiendo más de un golpe por columna. Las máquinas de tabulación electromecánicas representan la fecha internamente por el tiempo de los pulsos en relación con el movimiento de las tarjetas a través de la máquina. Cuando IBM pasó al procesamiento electrónico, comenzando con el multiplicador electrónico IBM 603 , utilizó una variedad de esquemas de codificación binaria que estaban vinculados al código de la tarjeta perforada.

IBM 's decimal codificado en binario ( BCD ) fue un esquema de codificación de seis bits utilizado por IBM ya en 1953, en sus 702 y 704 computadoras, y en su posterior serie 7000 y serie 1400 , así como en los periféricos asociados. Dado que el código de la tarjeta perforada en ese momento solo permitía dígitos, letras mayúsculas en inglés y algunos caracteres especiales, 6 bits eran suficientes. BCD amplió la codificación numérica simple de cuatro bits existente para incluir caracteres alfabéticos y especiales, asignándola fácilmente a la codificación de tarjetas perforadas que ya era de uso generalizado. Los códigos de IBM se utilizaron principalmente con equipos de IBM; otros proveedores de computadoras de la época tenían sus propios códigos de caracteres, a menudo de 6 bits, pero por lo general tenían la capacidad de leer cintas producidas en equipos de IBM. BCD fue el precursor de IBM 's Extended Binary Coded código de intercambio decimal (generalmente abreviado como EBCDIC), un esquema de codificación de ocho bits desarrollado en 1963 para el IBM System / 360 que contó con un conjunto de caracteres más grandes, incluyendo las letras minúsculas.

Las limitaciones de estos conjuntos pronto se hicieron evidentes y se desarrollaron varios métodos ad hoc para ampliarlas. La necesidad de admitir más sistemas de escritura para diferentes idiomas, incluida la familia CJK de escrituras de Asia Oriental , requería soporte para un número mucho mayor de caracteres y exigía un enfoque sistemático para la codificación de caracteres en lugar de los enfoques ad hoc previos .

Al tratar de desarrollar codificaciones de caracteres universalmente intercambiables, los investigadores de la década de 1980 enfrentaron el dilema de que, por un lado, parecía necesario agregar más bits para acomodar caracteres adicionales, pero por otro lado, para los usuarios del conjunto de caracteres relativamente pequeño. del alfabeto latino (que todavía constituía la mayoría de los usuarios de computadoras), esos bits adicionales eran un desperdicio colosal de recursos informáticos entonces escasos y costosos (ya que siempre se reducirían a cero para tales usuarios). En 1985, la unidad de disco duro del usuario promedio de una computadora personal podía almacenar solo unos 10 megabytes y costaba aproximadamente 250 dólares en el mercado mayorista (y mucho más si se compraba por separado al por menor), por lo que era muy importante en el momento de hacer cada recuento de bits.

La solución de compromiso que finalmente se encontró y desarrolló en Unicode fue romper la suposición (que se remonta a los códigos telegráficos) de que cada carácter siempre debe corresponder directamente a una secuencia particular de bits. En su lugar, los caracteres se asignarían primero a una representación intermedia universal en forma de números abstractos llamados puntos de código . Los puntos de código se representarían entonces de diversas formas y con varios números predeterminados de bits por carácter (unidades de código) según el contexto. Para codificar puntos de código más altos que la longitud de la unidad de código, como por encima de 256 para unidades de 8 bits, la solución fue implementar codificaciones de ancho variable donde una secuencia de escape señalaría que los bits subsiguientes deberían analizarse como un punto de código más alto.

Terminología

Terminología relacionada con la codificación de caracteres
KB Dubeolsik para Old Hangul (NG3) .svg
  • Un carácter es una unidad mínima de texto que tiene valor semántico.
  • Un juego de caracteres es una colección de caracteres que pueden usarse en varios idiomas. Ejemplo: el inglés y la mayoría de los idiomas europeos usan el juego de caracteres latinos, aunque el juego de caracteres griego solo lo usa el idioma griego.
  • Un juego de caracteres codificados es un juego de caracteres en el que cada carácter corresponde a un número único.
  • Un punto de código de un juego de caracteres codificado es cualquier valor permitido en el juego de caracteres o espacio de código.
  • Un espacio de código es un rango de números enteros cuyos valores son puntos de código.
  • Una unidad de código es una secuencia de bits que se utiliza para codificar cada carácter de un repertorio dentro de una forma de codificación determinada. Esto se conoce como valor de código en algunos documentos.
Repertorio de personajes (el conjunto abstracto de personajes)

El repertorio de caracteres es un conjunto abstracto de más de un millón de caracteres que se encuentran en una amplia variedad de escrituras que incluyen latín, cirílico, chino, coreano, japonés, hebreo y arameo.

Otros símbolos, como la notación musical, también se incluyen en el repertorio de caracteres. Tanto los estándares Unicode como GB18030 tienen un repertorio de caracteres. A medida que se agregan nuevos caracteres a un estándar, el otro estándar también agrega esos caracteres para mantener la paridad.

El tamaño de la unidad de código es equivalente a la medida de bits para la codificación particular:

  • Una unidad de código en US-ASCII consta de 7 bits;
  • Una unidad de código en UTF-8 , EBCDIC y GB18030 consta de 8 bits;
  • Una unidad de código en UTF-16 consta de 16 bits;
  • Una unidad de código en UTF-32 consta de 32 bits.

Ejemplo de una unidad de código: Considere una cadena de las letras "abc" seguida de U + 10400 𐐀 DESERET LETRA MAYÚSCULA LARGA I (representada con 1 char32_t, 2 char16_t o 4 char8_t). Esa cadena contiene:

  • cuatro personajes;
  • cuatro puntos de código
  • cualquiera:
    cuatro unidades de código en UTF-32 (00000061, 00000062, 00000063, 00010400)
    cinco unidades de código en UTF-16 (0061, 0062, 0063, d801, dc00), o
    siete unidades de código en UTF-8 (61, 62, 63, f0, 90, 90, 80).

La convención para hacer referencia a un carácter en Unicode es comenzar con 'U +' seguido del valor del punto de código en hexadecimal. El rango de puntos de código válidos para el estándar Unicode es U + 0000 a U + 10FFFF, inclusive, dividido en 17 planos , identificados por los números 0 a 16. Los caracteres en el rango U + 0000 a U + FFFF están en el plano 0, llamado Plano Multilingüe Básico (BMP). Este plano contiene los caracteres más utilizados. Los caracteres en el rango U + 10000 a U + 10FFFF en los otros planos se denominan caracteres suplementarios .

La siguiente tabla muestra ejemplos de valores de puntos de código:

Personaje Punto de código Unicode Glifo
Latín A U + 0041 Α
S aguda latina U + 00DF ß
Han para Oriente U + 6771
Ampersand U + 0026 Y
Signo de exclamación invertido U + 00A1 ¡
Signo de sección U + 00A7 §

Un punto de código está representado por una secuencia de unidades de código. El mapeo está definido por la codificación. Por lo tanto, el número de unidades de código necesarias para representar un punto de código depende de la codificación:

  • UTF-8: los puntos de código se asignan a una secuencia de una, dos, tres o cuatro unidades de código.
  • UTF-16: las unidades de código son dos veces más largas que las unidades de código de 8 bits. Por lo tanto, cualquier punto de código con un valor escalar menor que U + 10000 se codifica con una única unidad de código. Los puntos de código con un valor U + 10000 o superior requieren dos unidades de código cada uno. Estos pares de unidades de código tienen un término único en UTF-16: "pares sustitutos Unicode".
  • UTF-32: la unidad de código de 32 bits es lo suficientemente grande como para que cada punto de código se represente como una única unidad de código.
  • GB18030: múltiples unidades de código por punto de código son comunes, debido a las pequeñas unidades de código. Los puntos de código se asignan a una, dos o cuatro unidades de código.

Modelo de codificación Unicode

Unicode y su estándar paralelo, el conjunto de caracteres universal ISO / IEC 10646 , juntos constituyen una codificación de caracteres unificada y moderna. En lugar de asignar caracteres directamente a octetos ( bytes ), definen por separado qué caracteres están disponibles, los números naturales correspondientes ( puntos de código ), cómo se codifican esos números como una serie de números naturales de tamaño fijo (unidades de código) y, finalmente, cómo esos las unidades se codifican como una secuencia de octetos. El propósito de esta descomposición es establecer un conjunto universal de caracteres que se pueden codificar de diversas formas. Para describir este modelo correctamente se requieren términos más precisos que "juego de caracteres" y "codificación de caracteres". Los términos utilizados en el modelo moderno son los siguientes:

Un repertorio de caracteres es el conjunto completo de caracteres abstractos que admite un sistema. El repertorio puede ser cerrado, es decir, no se permiten adiciones sin crear un nuevo estándar (como es el caso de ASCII y la mayoría de la serie ISO-8859), o puede ser abierto, permitiendo adiciones (como es el caso de Unicode y en cierta medida las páginas de códigos de Windows ). Los personajes de un repertorio determinado reflejan las decisiones que se han tomado sobre cómo dividir los sistemas de escritura en unidades de información básicas. Las variantes básicas de los alfabetos latino , griego y cirílico se pueden dividir en letras, dígitos, puntuación y algunos caracteres especiales , como el espacio, que se pueden organizar en secuencias lineales simples que se muestran en el mismo orden en que se muestran. leer. Pero incluso con estos alfabetos, los diacríticos plantean una complicación: pueden considerarse como parte de un solo carácter que contiene una letra y diacrítico (conocido como carácter precompuesto), o como caracteres separados. El primero permite un sistema de manejo de texto mucho más simple, pero el segundo permite usar cualquier combinación de letras / diacríticos en el texto. Las ligaduras plantean problemas similares. Otros sistemas de escritura, como el árabe y el hebreo, se representan con repertorios de caracteres más complejos debido a la necesidad de acomodar elementos como texto bidireccional y glifos que se unen de diferentes maneras para diferentes situaciones.

Un conjunto de caracteres codificados (CCS) es una función que asigna caracteres a puntos de código (cada punto de código representa un carácter). Por ejemplo, en un repertorio dado, la letra mayúscula "A" en el alfabeto latino podría estar representada por el punto de código 65, el carácter "B" por 66, y así sucesivamente. Varios conjuntos de caracteres codificados pueden compartir el mismo repertorio; por ejemplo, las páginas de códigos ISO / IEC 8859-1 e IBM 037 y 500 cubren el mismo repertorio pero las asignan a diferentes puntos de código.

Una forma de codificación de caracteres (CEF) es la asignación de puntos de código a unidades de código para facilitar el almacenamiento en un sistema que representa los números como secuencias de bits de longitud fija (es decir, prácticamente cualquier sistema informático). Por ejemplo, un sistema que almacena información numérica en unidades de 16 bits solo puede representar directamente los puntos de código 0 a 65,535 en cada unidad, pero los puntos de código más grandes (digamos, 65,536 a 1.4 millones) podrían representarse usando múltiples unidades de 16 bits. Esta correspondencia está definida por un CEF.

A continuación, un esquema de codificación de caracteres (CES) es la asignación de unidades de código a una secuencia de octetos para facilitar el almacenamiento en un sistema de archivos basado en octetos o la transmisión a través de una red basada en octetos. Los esquemas de codificación de caracteres simples incluyen UTF-8 , UTF-16BE , UTF-32BE , UTF-16LE o UTF-32LE ; Los esquemas de codificación de caracteres compuestos, como UTF-16 , UTF-32 e ISO / IEC 2022 , cambian entre varios esquemas simples mediante el uso de marcas de orden de bytes o secuencias de escape ; Los esquemas de compresión intentan minimizar el número de bytes utilizados por unidad de código (como SCSU , BOCU y Punycode ).

Aunque UTF-32BE es un CES más simple, la mayoría de los sistemas que trabajan con Unicode usan UTF-8 , que es compatible con versiones anteriores de ASCII de ancho fijo y asigna puntos de código Unicode a secuencias de octetos de ancho variable, o UTF-16BE , que es hacia atrás. compatible con UCS-2BE de ancho fijo y asigna puntos de código Unicode a secuencias de ancho variable de palabras de 16 bits. Consulte la comparación de codificaciones Unicode para obtener una discusión detallada.

Finalmente, puede haber un protocolo de nivel superior que proporcione información adicional para seleccionar la variante particular de un carácter Unicode , particularmente cuando hay variantes regionales que se han 'unificado' en Unicode como el mismo carácter. Un ejemplo es el atributo XML xml: lang.

El modelo Unicode utiliza el término mapa de caracteres para los sistemas históricos que asignan directamente una secuencia de caracteres a una secuencia de bytes, cubriendo todas las capas CCS, CEF y CES.

Juegos de caracteres, mapas de caracteres y páginas de códigos

Históricamente, los términos "codificación de caracteres", "mapa de caracteres", "conjunto de caracteres" y " página de códigos " eran sinónimos en informática , ya que el mismo estándar especificaría un repertorio de caracteres y cómo debían codificarse en una secuencia de unidades de código: generalmente con un solo carácter por unidad de código. Pero ahora los términos tienen significados relacionados pero distintos, debido a los esfuerzos de los organismos de normalización por utilizar una terminología precisa al escribir y unificar muchos sistemas de codificación diferentes. Independientemente, los términos todavía se usan indistintamente, y el conjunto de caracteres es casi omnipresente.

Una " página de códigos " generalmente significa una codificación orientada a bytes , pero con respecto a algún conjunto de codificaciones (que cubren diferentes scripts), donde muchos caracteres comparten los mismos códigos en la mayoría o en todas esas páginas de códigos. Los conjuntos de páginas de códigos más conocidos son "Windows" (basado en Windows-1252) e "IBM" / "DOS" (basado en la página de códigos 437 ); consulte la página de códigos de Windows para obtener más detalles. La mayoría, pero no todas, las codificaciones a las que se hace referencia como páginas de códigos son codificaciones de un solo byte (pero consulte octeto sobre tamaño de byte).

La Arquitectura de Representación de Datos de Carácter (CDRA) de IBM designa entidades con identificadores de juego de caracteres codificados ( CCSID ), cada uno de los cuales se denomina "juego de caracteres", "juego de caracteres", "página de códigos" o "CHARMAP".

El término "página de códigos" no aparece en Unix o Linux, donde se prefiere "charmap", generalmente en el contexto más amplio de las configuraciones regionales.

A diferencia de un " conjunto de caracteres codificados ", una "codificación de caracteres" es un mapa de caracteres abstractos a palabras de código . Un "conjunto de caracteres" en el lenguaje HTTP (y MIME ) es lo mismo que una codificación de caracteres (pero no lo mismo que CCS).

" Codificación heredada " es un término que a veces se utiliza para caracterizar codificaciones de caracteres antiguas, pero con una ambigüedad de sentido. La mayor parte de su uso se encuentra en el contexto de Unicodificación , donde se refiere a codificaciones que no cubren todos los puntos de código Unicode, o, más generalmente, usando un repertorio de caracteres algo diferente: varios puntos de código que representan un carácter Unicode, o viceversa (ver p. Ej. página de códigos 437 ). Algunas fuentes se refieren a una codificación como heredada solo porque precedió a Unicode. Todas las páginas de códigos de Windows se suelen denominar heredadas, tanto porque son anteriores a Unicode como porque no pueden representar los 2 21 puntos de código Unicode posibles.

Traducción de codificación de caracteres

Como resultado de tener muchos métodos de codificación de caracteres en uso (y la necesidad de compatibilidad con los datos archivados), se han desarrollado muchos programas de computadora para traducir datos entre esquemas de codificación como una forma de transcodificación de datos . Algunos de ellos se citan a continuación.

Multiplataforma :

  • Navegadores web : la mayoría de los navegadores web modernos cuentan con detección automática de codificación de caracteres. En Firefox 3, por ejemplo, consulte el submenú Ver / Codificación de caracteres.
  • iconv - programa y API estandarizada para convertir codificaciones
  • luit : programa que convierte la codificación de entrada y salida en programas que se ejecutan de forma interactiva
  • convert_encoding.py - Utilidad basada en Python para convertir archivos de texto entre codificaciones arbitrarias y finales de línea.
  • decodeh.py: algoritmo y módulo para adivinar heurísticamente la codificación de una cadena.
  • Componentes internacionales para Unicode : un conjunto de bibliotecas C y Java para realizar la conversión de juegos de caracteres. uconv se puede utilizar desde ICU4C.
  • chardet : esta es una traducción del código de detección de codificación automática de Mozilla al lenguaje informático Python.
  • Las versiones más recientes del comando de archivo de Unix intentan realizar una detección básica de la codificación de caracteres (también disponible en Cygwin ).
  • charset : biblioteca de plantillas C ++ con una interfaz simple para convertir entre C ++ / secuencias definidas por el usuario. charset definió muchos juegos de caracteres y le permite usar formatos Unicode con soporte de endianness .

Similar a Unix :

  • cmv: herramienta sencilla para transcodificar nombres de archivos.
  • convmv: convierte un nombre de archivo de una codificación a otra.
  • cstocs: convierte el contenido del archivo de una codificación a otra para los idiomas checo y eslovaco.
  • enca: analiza codificaciones para archivos de texto dados.
  • recodificar: convierte el contenido del archivo de una codificación a otra
  • utrac: convierte el contenido del archivo de una codificación a otra.

Ventanas :

  • Encoding.Convert - API .NET
  • MultiByteToWideChar / WideCharToMultiByte - Convertir de ANSI a Unicode y Unicode a ANSI
  • cscvt - herramienta de conversión de juego de caracteres
  • enca: analiza codificaciones para archivos de texto dados.

Ver también

Codificaciones de caracteres comunes

Referencias

Otras lecturas

enlaces externos