La codificación de caracteres es el proceso de asignar números a caracteres gráficos , especialmente 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 colectivamente 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 idiomas escritos , a veces restringidos a letras mayúsculas , números y algunos signos de puntuación únicamente. 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 utilizando 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, en 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]
La historia de los códigos de caracteres ilustra la necesidad cambiante 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 primer código de caracteres transmitido eléctricamente, 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 con una tecla de telégrafo y descifrable de oído, y persiste en el uso de radioaficionados y 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]
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 N° 2 (ITA2) en 1930. El nombre baudot tiene 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 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ó muchas de las cuestiones modernas de entonces (por ejemplo, códigos de letras y dígitos dispuestos para el cotejo automático), no alcanzó sus objetivos y duró poco. En 1963, el comité ASCII (que contenía al menos un miembro del comité Fieldata, WF Leubbert) publicó el primer código ASCII (X3.4-1963), que abordó la mayoría de las deficiencias de Fieldata, utilizando un código más simple. Muchos de los cambios fueron sutiles, como conjuntos de caracteres intercalables dentro de ciertos rangos numéricos. ASCII63 fue un éxito, ampliamente adoptado por la industria, y con la edició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 bastante ampliamente. La naturaleza centrada en Estados Unidos de ASCII67 se abordó de alguna manera en el estándar europeo ECMA-6 . [6]
Herman Hollerith inventó la codificación de datos con tarjetas perforadas a finales del siglo XIX para analizar datos del censo. Inicialmente, la posición de cada orificio 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 marcado por columna. Las máquinas tabuladoras electromecánicas representaban la fecha 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 vinculados al código de la tarjeta perforada.
IBM utilizó varios esquemas de codificación de caracteres de seis bits decimal codificado binario ( BCD ), comenzando ya en 1953 en sus computadoras 702 [7] y 704 , y en sus posteriores series 7000 y 1400 , así como en periféricos asociados. Dado que el código de tarjeta perforada que se utilizaba entonces sólo permitía dígitos, letras inglesas mayúsculas 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 tarjetas perforadas que ya se usaba ampliamente. Los códigos de IBM se utilizaron 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 IBM System/360 que presentaba un conjunto de caracteres más grande, incluidas letras minúsculas.
Al tratar 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 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 serían eliminados para dichos usuarios). En 1985, el disco duro de un usuario promedio de computadora personal podía almacenar sólo unos 10 megabytes y costaba aproximadamente 250 dólares estadounidenses en el mercado mayorista (y mucho más si se compraba por separado al por menor), [8] por lo que era muy importante en ese momento. para que cada bit cuente.
La solución de compromiso que finalmente se encontró y desarrolló en Unicode [ vago ] 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 cambio, 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 superiores a 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 posteriores debían analizarse como un punto de código superior.
De manera informal, los términos "codificación de caracteres", "mapa de caracteres", "conjunto de caracteres" y "página de códigos" se utilizan a menudo indistintamente. [9] Históricamente, el mismo estándar especificaría un repertorio de caracteres y cómo debían codificarse en un flujo de unidades de código, generalmente 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 se ha vuelto importante.
"Página de códigos" es un nombre histórico para un juego de caracteres codificados.
Originalmente, una página de códigos hacía referencia a un número de página específico en el manual del juego 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; 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 ).
A pesar de que ya no se hace referencia a números de página específicos en un estándar, todavía se hace referencia a muchas codificaciones de caracteres por su número de página de códigos; Asimismo, el término "página de códigos" todavía se utiliza a menudo para referirse a codificaciones de caracteres en general.
El término "página de códigos" no se utiliza en Unix o Linux, donde se prefiere "charmap", generalmente en el contexto más amplio de configuraciones regionales. La Arquitectura de representación de datos de caracteres (CDRA) de IBM designa entidades con identificadores de juegos de caracteres codificados ( CCSID ), cada uno de los cuales se denomina "juego de caracteres", "juego de caracteres", "página de códigos" o "CHARMAP". [12]
El tamaño de la unidad de código es equivalente a la medida de bits para la codificación particular:
Un punto de código está representado por una secuencia de unidades de código. El mapeo está definido por la codificación. Por tanto, el número de unidades de código necesarias para representar un punto de código depende de la codificación:
Exactamente lo que constituye un carácter varía según las codificaciones de caracteres.
Por ejemplo, para las letras con signos diacríticos , se pueden adoptar dos enfoques 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 solo glifo . El primero simplifica el sistema de manejo de texto, pero el segundo permite utilizar cualquier combinación de letras/diacríticos en el texto. Las ligaduras plantean problemas similares.
Exactamente cómo manejar las variantes de glifos es una elección que se debe tomar al construir una codificación de caracteres particular. Algunos sistemas de escritura, como el árabe y el hebreo, necesitan acomodar cosas como grafemas que están unidos de diferentes maneras en diferentes contextos, pero que representan el mismo carácter semántico.
Unicode y su estándar paralelo, el conjunto de caracteres universal ISO/IEC 10646 , juntos constituyen 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 esos puntos de código se asignan a una serie de números naturales de tamaño fijo (unidades de código) y, finalmente, cómo esas unidades están codificadas como una secuencia de octetos (bytes). El propósito de esta descomposición es establecer un conjunto universal de caracteres que puedan codificarse de diversas formas. 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 con el tiempo se agregarán nuevos caracteres al repertorio.
Un juego 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 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 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 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 puntos de código de 0 a 65.535 en cada unidad, pero 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 está definida por un 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 ASCII de longitud fija y asigna puntos de código Unicode a secuencias de octetos de longitud variable, o UTF-16BE . [ cita necesaria ] 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.
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 han sido "unificadas" 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]
En Unicode, se puede hacer referencia a un carácter como '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 U+0000 a U+10FFFF, inclusive, dividido en 17 planos , identificados por los números del 0 al 16. Los caracteres en el rango U+0000 a U+FFFF son en el plano 0, llamado Plano Multilingüe Básico (BMP). Este plano contiene los personajes 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:
Considere una cadena de letras "ab̲c𐐀", es decir, una cadena que contiene un carácter combinado Unicode ( U+0332 ̲ COMBINING LOW LINE ), así como un carácter suplementario ( U+10400 𐐀 DESERET LETRA MAYÚSCULA LARGA I ). Esta cadena tiene varias representaciones Unicode que son lógicamente equivalentes, aunque cada una de ellas se adapta a un conjunto diverso de circunstancias o variedad de requisitos:
a
, b̲
, c
,𐐀
a
, b
, _
, c
,𐐀
U+0061
, U+0062
, U+0332
, U+0063
,U+10400
0x00000061
, 0x00000062
, 0x00000332
, 0x00000063
,0x00010400
0x0061
, 0x0062
, 0x0332
, 0x0063
, 0xD801
,0xDC00
0x61
, 0x62
, 0xCC
, 0xB2
, 0x63
, 0xF0
, 0x90
, 0x90
,0x80
Tenga en cuenta 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 el mismo número total de bits (32) para representar el glifo, no es obvio cómo se relacionan los valores numéricos de bytes reales.
Como resultado de tener muchos métodos de codificación de caracteres en uso (y la necesidad de compatibilidad con 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.
Ventanas :
La codificación de caracteres más utilizada en la web es UTF-8 , utilizada en el 98,2% de los sitios web encuestados, en 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]
Nota de Android: el valor predeterminado de la plataforma Android es siempre UTF-8.
en realidad, normalmente se asume UTF-8 ya que es, con diferencia, la codificación más común.
Además de los juegos de caracteres
DEC
e
ISO
tradicionales , que se ajustan a la estructura y reglas de
ISO 2022
, el
VT510
admite varias páginas de códigos de PC IBM (
números de página
en el manual del juego de caracteres estándar de IBM) en modo PCTerm para emular el
terminal de consola
de PC estándar de la industria.