stringtranslate.com

Codificación de caracteres

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

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.

Historia

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 aeronáutico y de radioaficionados . 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 ). [2]

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 . [3]

Tarjeta perforada Hollerith de 80 columnas con juego de caracteres EBCDIC

Herman Hollerith inventó la codificación de datos con tarjetas perforadas a finales del siglo XIX para analizar datos del censo. Inicialmente, cada posición del 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.

El decimal codificado binario ( BCD ) de IBM era un esquema de codificación de seis bits utilizado por IBM ya en 1953 en sus computadoras 702 [4] 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. 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 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. BCD fue el precursor 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 intentar 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), [5] 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.

Terminología

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. [6] 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áginas de códigos

"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. [10] 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 las 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". [9]

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:

Puntos de código

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:

Caracteres

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.

Modelo de codificación Unicode

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: [9]

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 longitud 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 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. [9]

Puntos de código Unicode

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:

Ejemplo

Considere una cadena de letras "ab̲c𐐀", es decir, una cadena que contiene un carácter de combinación Unicode ( U+0332 ̲ ) así como un carácter suplementario ( U+10400 𐐀 ). 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:

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.

Transcodificación

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.

Multiplataforma :

Ventanas :

Ver también

Codificaciones de caracteres comunes

Referencias

  1. ^ "Definición de codificación de caracteres". Diccionario de términos técnicos . 24 de septiembre de 2010.
  2. ^ Tom Henderson (17 de abril de 2014). "Tablas de códigos de caracteres de computadoras antiguas y por qué siguen siendo relevantes". Oso inteligente . Consultado el 29 de abril de 2014 .
  3. ^ Tom Jennings (1 de marzo de 2010). "Una historia comentada de algunos códigos de caracteres" . Consultado el 1 de noviembre de 2018 .
  4. ^ "Manual preliminar de información de las máquinas de procesamiento de datos electrónicos IBM tipo 702" (PDF) . 1954. pág. 80. 22-6173-1. Archivado (PDF) desde el original el 9 de octubre de 2022.
  5. ^ Strelho, Kevin (15 de abril de 1985). "IBM impulsa los discos duros según nuevos estándares". InfoMundo . Popular Computing Inc. págs. 29–33 . Consultado el 10 de noviembre de 2020 .
  6. ^ abcd Shawn Steele (15 de marzo de 2005). "¿Cuál es la diferencia entre codificación, página de códigos, juego de caracteres y Unicode?". Documentos de Microsoft .
  7. ^ abcdefg "Glosario de términos Unicode". Consorcio Unicode.
  8. ^ ab "Capítulo 3: Conformidad". La versión 15.0 del estándar Unicode: especificación principal (PDF) . Consorcio Unicode. Septiembre de 2022. ISBN 978-1-936213-32-0.
  9. ^ 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 .
  10. ^ "Información del programador del terminal de vídeo VT510". Corporación de Equipos Digitales (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 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.
  11. ^ "Terminología (los tutoriales de Java)". Oráculo . Consultado el 25 de marzo de 2018 .
  12. ^ "Codificación.Método de conversión". Biblioteca de clases de Microsoft .NET Framework .
  13. ^ "Función MultiByteToWideChar (stringapiset.h)". Documentos de Microsoft . 13 de octubre de 2021.
  14. ^ "Función WideCharToMultiByte (stringapiset.h)". Documentos de Microsoft . 9 de agosto de 2022.

Otras lecturas

enlaces externos