Codificación de caracteres

ImprimirCitar
Usar números para representar caracteres de texto
Grabado con la palabra "Wikipedia" codificado 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 asignación de números a los caracteres gráficos, especialmente los caracteres escritos del lenguaje humano, lo que permite almacenarlos, transmitirlos y transformarlos mediante computadoras digitales. 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ódigo" 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 ú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 idiomas escritos. La codificación de caracteres utilizando estándares internacionalmente aceptados permite el intercambio mundial de texto en formato electrónico.

Historia

La historia de los códigos de caracteres ilustra la creciente necesidad 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 de telégrafo 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 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 parte del uso comercial del código Morse fue a través de maquinaria, a menudo se usaba como un código manual, generado a mano en 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).

Los ejemplos comunes de sistemas de codificación de caracteres incluyen el código Morse, el código Baudot, el Código estándar estadounidense 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 CCITT como International Telegraph Alphabet No. 2 (ITA2) en 1930. El nombre "baudot" se ha aplicado erróneamente a ITA2 y sus múltiples variantes. ITA2 adolecía de muchas deficiencias y, a menudo, se "mejoraba" por muchos fabricantes de equipos, a veces creando 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 modernos en ese momento (por ejemplo, códigos de letras y dígitos organizados para la intercalación de máquinas), Fieldata no cumplió con sus objetivos y duró poco. En 1963, el primer código ASCII (American Standard Code for Information Interchange) fue publicado (X3.4-1963) por el comité ASCII (que contenía al menos un miembro del comité Fieldata, W. F. 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 intercalables 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 arregló 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.

Hollerith 80-column punch card with EBCDIC character set

Herman Hollerith inventó la codificación de datos con tarjetas perforadas a fines del siglo XIX para analizar los datos del censo. Inicialmente, la posición de cada orificio representaba un elemento de datos diferente, pero más tarde, 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 tabuladoras electromecánicas representaban la fecha internamente por la temporizació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's Binary Coded Decimal (BCD) era un esquema de codificación de seis bits utilizado por IBM ya en 1953 en sus computadoras 702 y 704, y en sus posteriores series 7000 y 1400, así como en periféricos 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. BCD amplió la codificación numérica simple de cuatro bits existente para incluir caracteres alfabéticos y especiales, mapeándola fácilmente a la codificación de tarjetas perforadas que ya estaba en 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 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.

Las limitaciones de estos conjuntos pronto se hicieron evidentes y se desarrollaron una serie de métodos ad hoc para ampliarlos. La necesidad de admitir más sistemas de escritura para diferentes idiomas, incluida la familia CJK de escrituras de Asia oriental, requería admitir una cantidad mucho mayor de caracteres y exigía un enfoque sistemático para la codificación de caracteres en lugar del ad hoc anterior. enfoques.

Al tratar de desarrollar codificaciones de caracteres universalmente intercambiables, los investigadores en la década de 1980 se enfrentaron al dilema de que, por un lado, parecía necesario agregar más bits para acomodar caracteres adicionales, pero por otro lado, para los usuarios de los relativamente pequeño conjunto de caracteres del alfabeto latino (que aún constituía la mayoría de los usuarios de computadoras), esos bits adicionales fueron un desperdicio colosal de recursos informáticos entonces escasos y costosos (ya que siempre se reducirían a cero para dichos 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 US$250 en el mercado mayorista (y mucho más si se compraba por separado en el comercio minorista), por lo que era muy importante en el hora de hacer que cada bit cuente.

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 debería corresponder directamente a una secuencia particular de bits. En cambio, 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 se representarían entonces 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 largos que la longitud de la unidad de código, como arriba de 256 para unidades de ocho bits, la solución fue implementar codificaciones de longitud 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 for Old Hangul (NG3).svg
  • A carácter es una unidad mínima de texto que tiene valor semántico.
  • A carácter es una colección de caracteres que podrían ser utilizados por varios idiomas. Ejemplo: El conjunto de caracteres latinos es utilizado por el inglés y la mayoría de los idiomas europeos, aunque el conjunto de caracteres griego es utilizado sólo por el idioma griego.
  • A conjunto de caracteres codificados es un personaje en el que cada personaje corresponde a un número único.
  • A punto de un conjunto de caracteres codificados es cualquier valor permitido en el conjunto de caracteres o espacio de código.
  • A espacio es una gama de enteros cuyos valores son puntos de código.
  • A unidad de código es el "tamaño de la palabra" del esquema de codificación de caracteres, como 7-bit, 8-bit, 16-bit. En algunos esquemas, algunos caracteres se codifican usando múltiples unidades de código, dando como resultado una codificación de longitud variable. A code unit is referred to as a valor de código en algunos documentos.
Repertorio de caracteres (el conjunto abstracto de caracteres)

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 alfabetos, incluidos el latín, el cirílico, el chino, el coreano, el japonés, el hebreo y el arameo.

Otros símbolos como la notación musical también se incluyen en el repertorio de caracteres. Tanto el estándar Unicode como el GB 18030 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 en 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 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.
Ejemplo de una unidad de código

Considere una cadena de letras "ab̲c𐐀", es decir, una cadena que contiene un carácter de combinación Unicode (U+0332 ̲ ) como bueno, un carácter complementario (U+10400 𐐀 ). Esta cadena tiene varias representaciones que son lógicamente equivalentes, aunque cada una se adapta a un conjunto diverso de circunstancias o rango de requisitos:

  • Cuatro caracteres 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
  • Six UTF-16 code units (16-bit integers)
    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

Observe en particular el último carácter, que se representa con un valor 1 de 32 bits, o 2 con valores de 16 bits. o 4 valores de 8 bits. Aunque cada una de esas formas usa el mismo número total de bits (32) para representar el glifo, los valores de bytes numéricos reales y su disposición parecen no tener ninguna relación.

Punto de código

La convención para referirse 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 Básico Multilingüe (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 punto de código:

Cara Punto de código Unicode Glyph
Latin A U+0041 A
Latin sharp S U+00DF ß
Han para Oriente U+6771 .
Ampersand U+0026 "
Marca de exclamación invertida U+00A1 ¡No!
Signos de sección U+00A7 §

Un punto de código se representa mediante 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 requeridas para representar un punto de código depende de la codificación:

  • UTF-8: code points map a una secuencia de una, dos, tres o cuatro unidades de código.
  • UTF-16: unidades de código son el doble de unidades de código de 8 bits. Por lo tanto, cualquier punto de código con un valor de escalar inferior a U+10000 está codificado 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: "Unicode surrogate pairs".
  • UTF-32: la unidad de código de 32 bits es lo suficientemente grande que cada punto de código está representado como una unidad de código único.
  • GB 18030: múltiples unidades de código por punto de código son comunes, debido a las unidades de código pequeño. 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 universales ISO/IEC 10646, juntos constituyen una codificación de caracteres moderna y unificada. 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 números las unidades se codifican como un flujo de octetos. El propósito de esta descomposición es establecer un conjunto universal de caracteres que se puedan codificar de varias maneras. Para describir correctamente este modelo se requieren términos más precisos que "conjunto 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 con ASCII y la mayoría de la serie ISO-8859), o puede ser abierto, permitiendo adiciones (como es el caso con Unicode y para limitadamente las páginas de códigos de Windows). Los caracteres de un repertorio determinado reflejan decisiones que se han tomado sobre cómo dividir los sistemas de escritura en unidades básicas de información. 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 son se muestran en el mismo orden en que se leen. Pero incluso con estos alfabetos, los signos diacríticos presentan una complicación: pueden considerarse como parte de un solo carácter que contiene una letra y un signo 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 cosas como el texto bidireccional y los glifos que se unen de diferentes maneras para distintas 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 representado por el punto de código 65, el carácter "B" a 66, y así sucesivamente. Múltiples conjuntos de caracteres codificados pueden compartir el mismo repertorio; por ejemplo, ISO/IEC 8859-1 y las páginas de códigos 037 y 500 de IBM cubren el mismo repertorio pero las asignan a diferentes puntos de código.

Un formulario 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) se pueden representar mediante el uso de varias 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 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, BOCU y Punycode).

Aunque UTF-32BE es un CES más simple, la mayoría de los sistemas que funcionan con Unicode usan UTF-8, que es compatible con versiones anteriores con ASCII de longitud fija y asigna puntos de código Unicode a secuencias de octetos de longitud variable, o UTF-16BE, 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 las codificaciones Unicode para obtener una discusión detallada.

Finalmente, puede haber un protocolo de nivel superior que proporciona información adicional para seleccionar la variante particular de un carácter Unicode, particularmente donde 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 sistemas históricos que asignan directamente una secuencia de caracteres a una secuencia de bytes, cubriendo todas las capas CCS, CEF y CES.

Conjuntos 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 se codificarían en un flujo 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, con juego de caracteres siendo 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) y "IBM"/"DOS" (basado en la página de códigos 437), consulte la página de códigos de Windows para obtener más información. La mayoría de las codificaciones, pero no todas, denominadas páginas de códigos son codificaciones de un solo byte (pero consulte el octeto sobre el tamaño de byte).

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

El término "página de códigos" no ocurre en Unix o Linux donde "charmap" se prefiere, por lo general en el contexto más amplio de locales.

A diferencia de un "conjunto de caracteres codificados", una "codificación de caracteres" es un mapa de caracteres abstractos a palabras clave. 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 usa 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 Unicode, donde se refiere a codificaciones que no cubren todos los puntos de código Unicode o, de manera más general, utilizan un repertorio de caracteres algo diferente: varios puntos de código que representan un carácter Unicode, o viceversa (ver p. página de códigos 437). Algunas fuentes se refieren a una codificación como heredada solo porque precedía a Unicode. Todas las páginas de códigos de Windows suelen denominarse heredadas, tanto porque son anteriores a Unicode como porque no pueden representar los 221 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 versiones anteriores de 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 estos 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, vea el submenú de codificación View/Character.
  • iconov – un programa y API estandarizada para convertir codificacións
  • luit – un programa que convierte la codificación de entrada y salida a programas que funcionan interactivamente
  • convert_encoding.py – una utilidad basada en Python para convertir archivos de texto entre codificación arbitraria y finalizaciones de línea
  • decodeh.py – un 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 charsets. uconv se puede utilizar de ICU4C.
  • chardet – Esta es una traducción del código de detección de codificación automática de Mozilla en el lenguaje del ordenador Python.
  • Las versiones más recientes del comando Unix intentan hacer una detección básica de codificación de caracteres (también disponible en Cygwin).
  • charset – C++ biblioteca de plantillas con interfaz sencilla para convertir entre secuencias definidas por C++/user. charset definió muchos conjuntos de caracteres y le permite utilizar formatos Unicode con soporte de endianness.

Como Unix:

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

Ventanas:

  • Codificación. Convertir –.NET API
  • MultiByteToWideChar/WideCharToMultiByte – convertir de ANSI a Unicode & Unicode a ANSI
  • cscvt – una herramienta de conversión de conjunto de caracteres
  • enca – analiza codificación para archivos de texto dados.

Contenido relacionado

XFree86

Programación alfabetizada

Intercambio de paquetes entre redes

Más resultados...
Tamaño del texto:
Copiar