Codificación de caracteres

Uso de números para representar caracteres de texto

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".

La codificación de caracteres es el proceso de asignar números a caracteres gráficos , especialmente a los caracteres escritos del lenguaje humano , lo que permite almacenarlos , transmitirlos y transformarlos mediante computadoras digitales . [ 1] Los valores numéricos que componen una codificación de caracteres se conocen como " puntos de código " y, en conjunto, comprenden un "espacio de código", una " página de códigos " o un " mapa de caracteres ".

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 lenguajes escritos , a veces restringidos a letras mayúsculas , números y 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 mediante estándares aceptados internacionalmente permite el intercambio mundial de texto en formato electrónico.

La codificación de caracteres más utilizada en la web es UTF-8 , utilizada en el 98,2% de los sitios web encuestados, a mayo de 2024. [2] En programas de aplicación y tareas del sistema operativo , tanto UTF-8 como UTF-16 son opciones populares. [3] [4]

Historia

La historia de los códigos de caracteres ilustra la necesidad en constante evolución de información simbólica basada en caracteres transmitida por máquinas a distancia, utilizando medios eléctricos que en su día 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 , el Braille , las 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 primer código de caracteres transmitido eléctricamente conocido, 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 algún uso comercial del código Morse se hacía a través de maquinaria, a menudo se utilizaba como código manual, generado a mano en una llave de telégrafo y descifrable de oído, y persiste en la radioafición y el 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 ). [5]

Entre los ejemplos más comunes de sistemas de codificación de caracteres se 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 bien definido y extensible, ha sustituido a la mayoría de las codificaciones de caracteres anteriores, pero el camino de 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 N.º 2 (ITA2) en 1930. El nombre Baudot se ha aplicado erróneamente al ITA2 y sus muchas variantes. El ITA2 adolecía de muchas deficiencias y muchos fabricantes de equipos lo mejoraban a menudo, lo que a veces creaba problemas de compatibilidad. En 1959, el ejército estadounidense definió su código Fieldata , un código de seis o siete bits, introducido por el Cuerpo de Señales del Ejército de Estados Unidos. Si bien Fieldata abordó muchos de los problemas modernos de entonces (por ejemplo, códigos de letras y dígitos organizados para la intercalación por máquina), no alcanzó sus objetivos y duró poco. En 1963, el comité ASCII (que incluía al menos a un miembro del comité Fieldata, WF Leubbert) publicó el primer código ASCII (X3.4-1963), que solucionaba la mayoría de las deficiencias de Fieldata mediante un código más simple. Muchos de los cambios eran sutiles, como los conjuntos de caracteres agrupables dentro de ciertos rangos numéricos. ASCII63 fue un éxito, ampliamente adoptado por la industria y, con la publicación posterior 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 amplia. La naturaleza centrada en Estados Unidos de ASCII67 se abordó en cierta medida en el estándar europeo ECMA-6 . [6]

Tarjeta perforada Hollerith de 80 columnas con conjunto de caracteres EBCDIC

A finales del siglo XIX, Herman Hollerith inventó la codificación de datos mediante tarjetas perforadas para analizar los datos del censo. Al principio, cada posición de orificio representaba un elemento de datos diferente, pero más tarde, la información numérica se codificaba numerando las filas inferiores del 0 al 9, con un orificio en una columna que representaba su número de fila. Más tarde, los datos alfabéticos se codificaron permitiendo más de un orificio por columna. Las máquinas tabuladoras electromecánicas representaban los datos internamente mediante la sincronización 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 utilizó varios esquemas de codificación de caracteres de seis bits en formato BCD ( Binary Coded Decimal ), comenzando en 1953 en sus computadoras 702 [7] y 704 , y en sus posteriores series 7000 y 1400 , así como en los periféricos asociados. Dado que el código de tarjeta perforada que se usaba entonces solo permitía dígitos, letras mayúsculas en inglés y algunos caracteres especiales, seis bits eran suficientes. Estas codificaciones BCD ampliaron la codificación numérica simple de cuatro bits existente para incluir caracteres alfabéticos y especiales, asignándolos fácilmente a la codificación de tarjeta perforada que ya era de uso generalizado. Los códigos de IBM se usaban principalmente con equipos IBM; otros proveedores de computadoras de la época tenían sus propios códigos de caracteres, a menudo de seis bits, pero generalmente tenían la capacidad de leer cintas producidas en equipos IBM. Estas codificaciones BCD fueron las precursoras del Código de intercambio decimal codificado en binario extendido de IBM (generalmente abreviado como EBCDIC), un esquema de codificación de ocho bits desarrollado en 1963 para el IBM System/360 que presentaba un conjunto de caracteres más grande, incluidas letras minúsculas.

En el intento de desarrollar codificaciones de caracteres universalmente intercambiables, los investigadores de la década de 1980 se enfrentaron al dilema de que, por un lado, parecía necesario añadir más bits para dar cabida a caracteres adicionales, pero por otro lado, para los usuarios del relativamente pequeño conjunto de caracteres del alfabeto latino (que todavía constituían la mayoría de los usuarios de ordenadores), esos bits adicionales eran un desperdicio colosal de recursos informáticos entonces escasos y caros (ya que siempre estarían en cero para esos usuarios). En 1985, el disco duro del usuario medio de un ordenador personal podía almacenar sólo unos 10 megabytes, y costaba aproximadamente 250 dólares en el mercado mayorista (y mucho más si se compraba por separado en el comercio minorista), [8] por lo que en aquel momento era muy importante aprovechar cada bit.

La solución de compromiso que finalmente se encontró y se desarrolló en Unicode [ vague ] fue romper la suposición (que se remonta a los códigos telegráficos) de que cada carácter siempre debería corresponder directamente a una secuencia particular de bits. En su lugar, los caracteres primero se asignarían a una representación intermedia universal en forma de números abstractos llamados puntos de código . Los puntos de código luego se representarían de diversas maneras 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 ocho bits, la solución fue implementar codificaciones de longitud variable donde una secuencia de escape indicaría que los bits subsiguientes deberían analizarse como un punto de código más alto.

Terminología

De manera informal, los términos "codificación de caracteres", "mapa de caracteres", "conjunto de caracteres" y "página de códigos" suelen utilizarse indistintamente. [9] Históricamente, el mismo estándar especificaba un repertorio de caracteres y cómo debían codificarse en un flujo de unidades de código, normalmente con un solo carácter por unidad de código. Sin embargo, debido a la aparición de codificaciones de caracteres más sofisticadas, la distinción entre estos términos ha cobrado importancia.

  • Un carácter es una unidad mínima de texto que tiene valor semántico. [9] [10]
  • Un conjunto de caracteres es una colección de elementos utilizados para representar texto. [9] [10] Por ejemplo, el alfabeto latino y el alfabeto griego son conjuntos de caracteres.
  • Un conjunto de caracteres codificados es un conjunto de caracteres asignado a un conjunto de números únicos. [10] Por razones históricas, a esto también se lo suele denominar página de códigos . [9]
  • Un repertorio de caracteres es el conjunto de caracteres que se pueden representar mediante un conjunto de caracteres codificados en particular. [10] [11] El repertorio puede ser cerrado, lo que significa que no se permiten adiciones sin crear un nuevo estándar (como es el caso de ASCII y la mayor parte de la serie ISO-8859); o puede ser abierto, lo que permite adiciones (como es el caso de Unicode y, en cierta medida, las páginas de códigos de Windows ). [11]
  • Un punto de código es un valor o posición de un carácter en un conjunto de caracteres codificados. [10]
  • Un espacio de código es el rango de valores numéricos abarcado por un conjunto de caracteres codificados. [10] [12]
  • Una unidad de código es la combinación mínima de bits que puede representar un carácter en una codificación de caracteres (en términos informáticos , es el tamaño de palabra de la codificación de caracteres). [10] [12] Por ejemplo, las unidades de código comunes incluyen 7 bits, 8 bits, 16 bits y 32 bits. En algunas codificaciones, algunos caracteres se codifican utilizando múltiples unidades de código; dicha codificación se conoce como codificación de ancho variable .

Páginas de códigos

"Página de códigos" es un nombre histórico para un conjunto de caracteres codificados.

Originalmente, una página de códigos se refería a un número de página específico en el manual del conjunto de caracteres estándar de IBM, que definiría una codificación de caracteres particular. [13] Otros proveedores, incluidos Microsoft , SAP y Oracle Corporation , también publicaron sus propios conjuntos de páginas de códigos; las suites de páginas de códigos más conocidas son " Windows " (basada en Windows-1252) e "IBM"/"DOS" (basada en la página de códigos 437 ).

A pesar de que ya no se hace referencia a números de página específicos en un estándar, muchas codificaciones de caracteres aún se conocen por su número de página de códigos; de la misma manera, el término "página de códigos" todavía se utiliza a menudo para referirse a las codificaciones de caracteres en general.

El término "página de códigos" no se utiliza en Unix o Linux, donde se prefiere "charmap", normalmente en el contexto más amplio de las configuraciones regionales. La arquitectura de representación de datos de caracteres (CDRA) de IBM designa entidades con identificadores de conjuntos de caracteres codificados ( CCSID ), cada uno de los cuales se denomina de diversas formas "charset", "conjunto de caracteres", "página de códigos" o "CHARMAP". [12]

Unidades de código

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 ASCII consta de 7 bits;
  • Una unidad de código en UTF-8 , EBCDIC y GB 18030 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.

Puntos de código

Un punto de código se representa mediante una secuencia de unidades de código. La asignación se define mediante la codificación. Por lo tanto, la cantidad 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 tienen el doble de longitud que las unidades de código de 8 bits. Por lo tanto, cualquier punto de código con un valor escalar inferior a U+10000 se codifica con una sola 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.
  • GB 18030: es común que existan varias unidades de código por punto de código debido a que las unidades de código son pequeñas. Los puntos de código se asignan a una, dos o cuatro unidades de código. [14]

Personajes

Lo que exactamente constituye un carácter varía según las codificaciones de caracteres.

Por ejemplo, en el caso de las letras con diacríticos , se pueden utilizar dos métodos distintos para codificarlas: se pueden codificar como un único carácter unificado (conocido como carácter precompuesto) o como caracteres separados que se combinan en un único glifo . El primero simplifica el sistema de manejo de texto, pero el segundo permite utilizar cualquier combinación de letra y diacrítico en el texto. Las ligaduras plantean problemas similares.

La forma exacta de manejar las variantes de glifos es una decisión que debe tomarse al construir una codificación de caracteres en particular. Algunos sistemas de escritura, como el árabe y el hebreo, necesitan dar cabida a elementos como grafemas que se unen de distintas maneras en distintos contextos, pero que representan el mismo carácter semántico.

Modelo de codificación Unicode

Unicode y su estándar paralelo, el Conjunto Universal de Caracteres ISO/IEC 10646 , constituyen juntos un estándar unificado para la codificación de caracteres. En lugar de asignar caracteres directamente a bytes , Unicode define por separado un conjunto de caracteres codificados que asigna caracteres a números naturales únicos ( puntos de código ), cómo se asignan esos puntos de código a una serie de números naturales de tamaño fijo (unidades de código) y, finalmente, cómo se codifican esas unidades como un flujo de octetos (bytes). El propósito de esta descomposición es establecer un conjunto universal de caracteres que se puedan codificar de diversas maneras. Para describir este modelo con precisión, Unicode utiliza su propio conjunto de terminología para describir su proceso: [12]

Un repertorio de caracteres abstractos (ACR) es el conjunto completo de caracteres abstractos que admite un sistema. Unicode tiene un repertorio abierto, lo que significa que se irán añadiendo nuevos caracteres al repertorio con el tiempo.

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 determinado, la letra mayúscula "A" del alfabeto latino podría estar representada por el punto de código 65, el carácter "B" por el 66, y así sucesivamente. Varios conjuntos de caracteres codificados pueden compartir el mismo repertorio de caracteres; por ejemplo, ISO/IEC 8859-1 y las páginas de códigos 037 y 500 de IBM cubren el mismo repertorio pero los 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 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 del 0 al 65.535 en cada unidad, pero los puntos de código más grandes (por ejemplo, de 65.536 a 1,4 millones) podrían representarse utilizando múltiples unidades de 16 bits. Esta correspondencia se define mediante una CEF.

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 y 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 una marca de orden de bytes o secuencias de escape ; los esquemas de compresión intentan minimizar la cantidad de bytes utilizados por unidad de código (como SCSU y BOCU ).

Aunque UTF-32BE y UTF-32LE son CES más simples, la mayoría de los sistemas que trabajan con Unicode usan UTF-8 , que es compatible con versiones anteriores de ASCII de longitud fija y asigna puntos de código Unicode a secuencias de octetos de longitud variable, o UTF-16BE , [ cita requerida ] que es compatible con versiones anteriores de UCS-2BE de longitud fija y asigna puntos de código Unicode a secuencias de palabras de 16 bits de longitud variable. Consulte la comparación de codificaciones Unicode para obtener una discusión detallada.

Por último, puede existir un protocolo de nivel superior que proporcione información adicional para seleccionar la variante particular de un carácter Unicode , en particular cuando existen 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 otros sistemas que asignan directamente una secuencia de caracteres a una secuencia de bytes, cubriendo todas las capas CCS, CEF y CES. [12]

Puntos de código Unicode

En Unicode, un carácter puede ser denominado 'U+' seguido de su valor de punto de código en hexadecimal. El rango de puntos de código válidos (el espacio de código) para el estándar Unicode es de U+0000 a U+10FFFF, ambos inclusive, dividido en 17 planos , identificados por los números del 0 al 16. Los caracteres en el rango de 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 de 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:

PersonajePunto de código UnicodeGlifo
latín AU+0041Una
S latina agudaU+00DFß
Han para el esteU+6771
Y comercialU+0026&
Signo de exclamación invertidoU+00A1¡
Señal de secciónU+00A7§

Ejemplo

Considere una cadena de letras "ab̲c𐐀", es decir, una cadena que contiene un carácter de combinación Unicode ( U+0332 ̲ COMBINING LOW LINE ) así como un carácter complementario ( U+10400 𐐀 DESERET CAPITAL LETTER LONG I ). Esta cadena tiene varias representaciones Unicode que son lógicamente equivalentes, aunque cada una es adecuada para un conjunto diverso de circunstancias o rango de requisitos:

  • Cuatro personajes compuestos :
    a, , c,𐐀
  • Cinco grafemas :
    a, b, _, c,𐐀
  • Cinco puntos de código Unicode :
    U+0061, U+0062, U+0332, U+0063,U+10400
  • Cinco unidades de código UTF-32 (valores enteros de 32 bits):
    0x00000061, 0x00000062, 0x00000332, 0x00000063,0x00010400
  • Seis unidades de código UTF-16 (enteros de 16 bits)
    0x0061, 0x0062, 0x0332, 0x0063, 0xD801,0xDC00
  • Nueve unidades de código UTF-8 (valores de 8 bits o bytes )
    0x61, 0x62, 0xCC, 0xB2, 0x63, 0xF0, 0x90, 0x90,0x80

Nótese en particular que 𐐀 se representa con un valor de 32 bits (UTF-32), dos valores de 16 bits (UTF-16) o cuatro valores de 8 bits (UTF-8). Aunque cada una de esas formas utiliza la misma cantidad total de bits (32) para representar el glifo, no resulta obvio cómo se relacionan los valores numéricos reales de los bytes.

Transcodificación

Como resultado de la existencia de muchos métodos de codificación de caracteres en uso (y de la necesidad de compatibilidad con versiones anteriores de datos archivados), se han desarrollado muchos programas informáticos para traducir datos entre esquemas de codificación de caracteres, un proceso conocido como transcodificación . Algunos de ellos se citan a continuación.

Multiplataforma :

Ventanas :

  • Codificación.Convert – API .NET [15]
  • MultiByteToWideChar/WideCharToMultiByte: para convertir de ANSI a Unicode y de Unicode a ANSI [16] [17]

Codificaciones de caracteres comunes

La codificación de caracteres más utilizada en la web es UTF-8 , utilizada en el 98,2% de los sitios web encuestados, a mayo de 2024. [2] En programas de aplicación y tareas del sistema operativo , tanto UTF-8 como UTF-16 son opciones populares. [3] [4]

Véase también

Referencias

  1. ^ "Definición de codificación de caracteres". Diccionario de términos técnicos . 24 de septiembre de 2010.
  2. ^ ab "Encuesta sobre el uso de codificaciones de caracteres desglosada por clasificación". W3Techs . Consultado el 29 de abril de 2024 .
  3. ^ ab "Charset". Desarrolladores de Android . Consultado el 2 de enero de 2021 . Nota de Android: el valor predeterminado de la plataforma Android es siempre UTF-8.
  4. ^ ab Galloway, Matt (9 de octubre de 2012). "Codificación de caracteres para desarrolladores de iOS. ¿O UTF-8 y ahora qué?". Matt Galloway . Consultado el 2 de enero de 2021 . En realidad, normalmente se asume que se trata de UTF-8, ya que es, con diferencia, la codificación más común.
  5. ^ Tom Henderson (17 de abril de 2014). «Tablas de códigos de caracteres de computadoras antiguas y por qué siguen siendo relevantes». Smartbear. Archivado desde el original el 30 de abril de 2014. Consultado el 29 de abril de 2014 .
  6. ^ Tom Jennings (20 de abril de 2016). «Una historia anotada de algunos códigos de caracteres». Sensitive Research . Consultado el 1 de noviembre de 2018 .
  7. ^ "Manual preliminar de información de las máquinas de procesamiento electrónico de datos IBM tipo 702" (PDF) . 1954. pág. 80. 22-6173-1. Archivado (PDF) desde el original el 9 de octubre de 2022 – vía bitsavers.org.
  8. ^ Strelho, Kevin (15 de abril de 1985). "IBM lleva los discos duros a nuevos estándares". InfoWorld . Popular Computing Inc. pp. 29–33 . Consultado el 10 de noviembre de 2020 .
  9. ^ abcd Shawn Steele (15 de marzo de 2005). "¿Cuál es la diferencia entre una codificación, una página de códigos, un conjunto de caracteres y Unicode?". Microsoft Docs .
  10. ^ abcdefg «Glosario de términos Unicode». Consorcio Unicode.
  11. ^ ab "Capítulo 3: Conformidad". Estándar Unicode versión 15.0: especificación básica (PDF) . Consorcio Unicode. Septiembre de 2022. ISBN 978-1-936213-32-0.
  12. ^ abcde Whistler, Ken; Freytag, Asmus (11 de noviembre de 2022). «UTR#17: Modelo de codificación de caracteres Unicode». Consorcio Unicode . Consultado el 12 de agosto de 2023 .
  13. ^ "VT510 Video Terminal Programmer Information". Digital Equipment Corporation (DEC). 7.1. Conjuntos de caracteres: descripción general. Archivado desde el original el 26 de enero de 2016 . Consultado el 15 de febrero de 2017 . Además de los conjuntos de caracteres DEC e ISO tradicionales , que se ajustan a la estructura y las reglas de ISO 2022 , el VT510 admite varias páginas de códigos de IBM PC ( números de página en el manual de conjuntos de caracteres estándar de IBM) en modo PCTerm para emular la terminal de consola de las PC estándar de la industria.
  14. ^ "Terminología (Tutoriales de Java)". Oracle . Consultado el 25 de marzo de 2018 .
  15. ^ "Método Encoding.Convert". Biblioteca de clases de Microsoft .NET Framework .
  16. ^ "Función MultiByteToWideChar (stringapiset.h)". Microsoft Docs . 13 de octubre de 2021.
  17. ^ "Función WideCharToMultiByte (stringapiset.h)". Microsoft Docs . 9 de agosto de 2022.

Lectura adicional

  • Conjuntos de caracteres registrados por la Autoridad de Números Asignados de Internet (IANA)
  • Caracteres y codificaciones, por Jukka Korpela
  • Informe técnico Unicode n.° 17: Modelo de codificación de caracteres
  • Códigos de caracteres decimales y hexadecimales en HTML Unicode – Conversor de codificación
  • Lo mínimo que todo desarrollador de software debe saber sobre Unicode y los conjuntos de caracteres (¡sin excusas!) por Joel Spolsky (10 de octubre de 2003)
Obtenido de "https://es.wikipedia.org/w/index.php?title=Codificación_de_caracteres&oldid=1249825253"