charsets(7) Miscellaneous Information Manual charsets(7)

charsets - internacionalización y estándares de conjuntos de caracteres

Esta página de manual proporciona un breve repaso a los distintos estándares de codificación de caracteres y el modo en que se emplearon en Linux antes de que Unicode los reemplazase a todos. Alguna de esta información continúa siendo útil para las personas que trabajen con equipo o documentación antiguos.

Los estándares que se comentan son: ASCII, GB 2312, ISO/IEC 8859, JIS, KOI8-R, KS, y Unicode.

Se enfatiza principalmente en las codificaciones que se pueden encontrar actualmente en las distintas localizaciones en lugar de en la miríada de ellas que pueden encontrarse en otros sistemas.

ASCII (American Standard Code For Information Interchange) es el conjunto original de caracteres de 7 bits, originalmente diseñado para el inglés americano, también conocido como US-ASCII. Actualmente se define en la norma la ISO/IEC 646:1991 IRV (International Reference Version).

Existen diversas variantes del ASCII de 7 bits que reemplazan el signo del dolar por otros símbolos monetarios y caracteres de puntuación con caracteres alfabéticos no ingleses para cubrir el alemán, frances, español y otros. No se recomienda usar ningún de ellos; la libc de GNU no soporta localizaciones cuyos conjuntos de caracteres no sean verdaderos superconjuntos del ASCII.

Si se usa UTF-8, Unicode es compatible con ASCII por lo que el antiguo ASCII se verá perfectamente en sistemas modernos que utilicen UTF-8.

ISO/IEC 8859

ISO/IEC 8859 es una serie de 15 conjuntos de caracteres de 8 bits, todos los ellos formados por ASCII en su inferior (7 bits), caracteres invisibles de control en las posiciones 128 a 159, y 96 gráficos de ancho fijo en posiciones 160–255.

De estos, el más importante es ISO/IEC 8859-1 'Alfabeto Latino No. 1' / Latin-1). Gozó de un amplísimo grado de soporte por diferentes sistemas pero en la actualidad está siendo sustituido gradualmente por Unicode. Los caracteres de ISO/IEC 8859-1 son también los primeros 256 caracteres de Unicode.

El soporte de la consola para los otros conjuntos de caracteres ISO/IEC 8859 está disponible en Linux en varias utilidades (como setfont(8)) que modifican las relaciones entre el teclado y la tabla gráfica EGA y emplean la tabla de fuentes 'user mapping' en el driver de la consola.

Aquí se presentan breves descripciones de cada conjunto:

Latin-1 cubre la mayoría de lenguajes de Europa Occidental como el albanés, vasco, danés, inglés, feroés, gallego, islandés, irlandés, italiano, noruego, portugués, español y sueco. La falta de las ligaduras neerlandesas IJ/ij, de la francesa œ y de las antiguas comillas alemanas „“ se consideraba aceptable.
Latin-2 es el soporte para la mayoría de las lenguas eslavas y de Centro-Europa que se escriben con caracteres latinos: checo, alemán, húngaro, polaco, rumano, croata, eslovaco y esloveno. Se consideraba aceptable tener que sustituir los caracteres rumanos ș/ț con ş/ţ.
El latín-3 fue diseñado para gestionar el esperanto, maltés y turco, pero ISO/IEC 8859-9 fue empleado con posterioridad para el turco.
El latín-4 incoroporó letras para lenguas del norte de Europa como el estoniano, el letón y el lituano. Poseriormente sustituido por ISO/IEC 8859-10 e ISO/IEC 8859-13.
Letras cirílicas para el búlgaro, bielorruso, macedonio, ruso, serbio y (casi por completo) ucraniano. Nunca tuvo un amplio uso. Vea la discusión sobre el KOI8-R/KOI8-U más adelante.
Fue creado para el árabe. La tabla de glifos ISO/IEC 8859-6 es un tipo de letra fijo de formas de letra separadas, pero un visor adecuado debería combinarlas usando las formas inicial, medial y final adecuadas.
Fue creado para el griego actual en 1987 y posteriormente actualizado en el año 2003.
Para el hebreo moderno sin 'niqud' (signos de puntuación). Los 'niqud' y el hebreo bíblico 'oficial' se encuentran fuera del ámbito de este conjunto de caracteres; en Linux se prefiere la codificación UTF-8 para esto.
Ésta es una variante del Latin-1 que reemplaza letras islandesas con otras turcas.
El Latin 6 añade las últimas letras del inuit (esquimal de Groenlandia) y del sami (lapón) que faltaban en el Latin 4 para cubrir toda el área nórdica.
Implementa el alfabeto tailandés y es prácticamente idéntico al estándar TIS-620.
Este conjunto de caracteres no existe.
Para las lenguas de la Ribera del Báltico; en particular, incluye los caracteres letones que no se encuentran en Latin-4.
Éste es el conjunto de caracteres celta, que implementa: el antiguo irlandés, el gaélico manx, el galés, el gaélico, el cornuallés y el bretón.
Latin-9 es parecido al -enormemente usado- Latin-1 salvo que reemplaza algunos de los símbolos menos usados con el símbolo del euro y algunos caracteres franceses y finlandeses no incuidos en Latin-1.
Este conjunto abarca muchos idiomas del sudeste de Europa y, lo que es más importante: tiene mejor soporte para el rumano que Latin-2.

KOI8-R es un conjunto de caracteres no ISO muy usado en Rusia antes de Unicode. La primera mitad está formada por ASCII y la segunda es un conjunto de caracteres cirílicos algo mejor diseñado que ISO/IEC 8859-5. KOI8-U, basado en KOI8R, tiene un mejor soporte para el ucraniano. Ninguno de estos conjuntos son compatibles con ISO/IEC 2022, a diferencia de la serie ISO / IEC 8859.

El soporte de consola para el KOI8-R está disponible en Linux a través de utilidades de usuario (como setfont(8)) que modifican las asociaciones de teclas y la tabla de gráficos EGA y emplean la tabla de tipos de letra de "correspondencia de usuario" en el controlador de consola.

GB 2312 es un conjunto nacional estándar de caracteres para el chino continental que se usa para expresar chino simplificado. Al igual que JIS X 0208, los caracteres se proyectan en una matriz de 94x94 celdas de dos bytes que se usa para construir la codificación EUC-CN. EUC-CN es la codificación más importante para Linux e incluye ASCII y GB 2312. Dese cuenta que EUC-CN frecuentemente se identifica como GB, GB 2312 o CN-GB.

Big5 fue un conjunto de caracteres muy usado en Taiwán para expresar el chino tradicional, es al mismo tiempo un conjunto de caracteres y una codificación. Es un superconjunto de ASCII. Los caracteres no ASCII se expresan en dos bytes. Los bytes 0xa1–0xfe se utilizan como bytes principales para caracteres de dos bytes. Big5 y su extensión fueron ampliamente utilizados en Taiwán y Hong Kong. No es compatible con ISO/IEC 2022.

JIS X 0208 es el principal conjunto de caracteres estándar en Japón. Aunque hay algunos estándar nacionales japoneses más (como JIS X 0201, X 0212, y X 0213). Los caracteres se crean a partir de una matriz de dos bytes de 94x94, cada byte está en el intervalo 0x21–0x7e. Debe considerarse que JIS X 0208 es un conjunto de caracteres, no una codificación. Esto significa que el propio JIS X 0208 no se utiliza para expresar datos de texto. JIS X 0208 forma parte de codificaciones como EUC-JP, Shift_JIS y ISO/IEC 2022-JP. EUC-JP es la codificación más importante para Linux e incluye ASCII y JIS X 0208. En EUC-JP, los caracteres JIS X 0208 se expresan en dos bytes, cada uno de los cuales es el código JIS x 0208, más 0x80.

KS X 1001 es un conjunto de caracteres estándar nacional de Corea. Al igual que JIS X 0208, los caracteres se mapean en una matriz de dos bytes de 94x94. KS X 1001 se utiliza como JIS X 0208, como un componente para construir codificaciones como EUC-KR, Johab y ISO/IEC 2022-KR. EUC-KR es la codificación más importante para Linux e incluye ASCII y KS X 1001. KS C 5601 es como anteriormente se conocía a KS X 1001.

ISO/IEC 2022 e ISO/ IEC 4873

Las normas ISO/IEC 2022 y ISO/IEC 4873 describen un modelo de control de fuentes basado en la práctica VT100. Este modelo está (parcialmente) soportado por el núcleo de Linux y por xterm(1). Se han definido varias codificaciones de caracteres basadas en ISO/IEC 2022, especialmente para el japonés.

Hay 4 conjuntos de caracteres gráficos, llamados G0, G1, G2 y G3, y uno de ellos es el conjunto de caracteres actual para los códigos con el bit más alto a 0 (inicialmente G0), y uno de ellos es el conjunto de caracteres actual para los códigos con el bit más alto a 1 (inicialmente G1). Cada conjunto de caracteres gráfico tiene 94 ó 96 caracteres, y es esencialmente un conjunto de caracteres de 7 bits. Emplea códigos bien entre 040–0177 (041–0176) o bien entre 0240–0377 (0241–0376). G0 siempre tiene de tamaño 94 y emplea códigos en el rango 041–0176.

El cambio entre los conjuntos de caracteres se realiza empleando las funciones de cambio ^N (SO o LS1), ^O (SI o LS0), ESC n (LS2), ESC o (LS3), ESC N (SS2), ESC O (SS3), ESC ~ (LS1R), ESC } (LS2R), ESC | (LS3R). La función LSn hace que el conjunto de caracteres Gn sea el actual para los códigos con el bit más alto a 0. La función LSn hace que el conjunto de caracteres Gn sea el actual para los códigos con el bit más alto a 1. La función SSn hace que el conjunto de caracteres Gn (n=2 ó 3) sea el actual para el siguiente carácter solamente (tenga lo que tenga su bit más alto).

Un conjunto de 94 caracteres se designa como caracter Gn definido por una secuencia de escape ESC ( xx (para G0), ESC ) xx ( para G1), ESC * xx (Para G2), ESC + xx ( Para G3), donde xx es un símbolo o un par de símbolos que se encuentran en ISO/IEC 2375 Registro Internacional de conjuntos de caracteres codificados. Por ejemplo, ESC ( @ selecciona el conjunto de caracteres ISO/IEC 646 como G0, ESC ( A selecciona la serie de carácteres estándar del Reino Unido (con la libra en lugar del signo numérico), ESC ( B selecciona ASCII (con el dólar en lugar del símbolo de moneda), ESC ( M selecciona un conjunto de símbolos para lenguas africanas, ESC ) (!

Un conjunto de 96 caracteres se designa como el conjunto de caracteres Gn por una secuencia de escape ESC - xx (para G1), ESC . xx (para G2) o ESC / xx (para G3). Por ejemplo, ESC - G selecciona el alfabeto hebreo como el G1.

Un conjunto de caracteres multibyte se designa como el conjunto de caracteres Gn por una secuencia de escape ESC $ xx o ESC $ ( xx (para G0), ESC $ ) xx (para G1), ESC $ * xx (para G2), ESC $ + xx (para G3). Por ejemplo, ESC $ ( C selecciona el conjunto de caracteres coreano para G0. El conjunto de caracteres japonés seleccionado por ESC $ B tiene una versión más reciente seleccionada por ESC & @ ESC $ B.

ISO/IEC 4873 estipula un uso más restrictivo de conjuntos de caracteres, donde G0 es fijo (siempre ASCII), de modo que G1, G2, y G3 sólo pueden ser invocados para códigos con el conjunto de bits de orden alto. Concretamente,  [ha]N y ^O ya no se usan, ESC ( xx puede usarse sólo con xx=B, y ESC ) xx, ESC * xx, Esc + xx son equivalentes a ESC - xx, ESC. xx, ESS / xx, respectivamente.

TIS-620 es un conjunto de caracteres estándar nacional para el tailandés y un superconjunto de ASCII. De la mismo modo que la serie ISO/IEC 8859, los caracteres tailandeses se mapean en 0xa1–0xfe.

Unicode (ISO/IEC 10646) es un estándar cuyo objetivo es representar inequívocamente cada carácter conocido en cada lenguaje humano. La estructura de Unicode admite 20'1 bits para codificar cada carácter. Sin embargo, ya que la mayoría de los computadores no incluyen enteros de 20'1 bits, normalmente Unicode se codifica internamente mediante enteros de 32 bits y, o bien una serie de enteros de 16 bits (UTF-16) (que necesita dos enteros de 16 bits sólo cuando se codifican ciertos caracteres poco comunes), o bien una serie de bytes de 8 bits (UTF-8).

Linux representa Unicode empleando el Formato de Transformación Unicode de 8 bits (UTF-8). UTF-8 es una codificación de Unicode de longitud variable. Emplea 1 byte para codificar 7 bits, 2 bytes para 11 bits, 3 bytes para 16 bits, 4 bytes para 21 bits, 5 bytes para 26 bits, y 6 bytes para 31 bits.

Sean 0, 1, x el 0, el 1 ó un bit arbitrario. Un byte 0xxxxxxx representa el carácter Unicode 00000000 0xxxxxxx que codifica el mismo símbolo que el ASCII 0xxxxxxx. Así, ASCII va sin cambio alguno dentro de UTF-8, y la gente que emplea ASCII no nota ningún cambio: ni en el código ni en tamaños de fichero.

Un byte 110xxxxx es el comienzo de un código de 2 bytes, y 110xxxxx 10yyyyyy se ensambla en 00000xxx xxyyyyyy. Un byte 1110xxxx es el comienzo de un código de 3 bytes, y 1110xxxx 10yyyyyy 10zzzzzz se ensambla en xxxxyyyy yyzzzzzz. (Cuando se emplea UTF-8 para codificar el ISO/IEC 10646 de 31 bits, esta progresión continúa hasta códigos de 6 bytes.)

Para la mayoría de los textos en los conjuntos de caracteres ISO/IEC 8859, significará que los caracteres no ASCII están ahora codificados con dos bytes. Esto tiende a incrementar entorno al 1 o 2 por cien los archivos de texto ordinarios. Para los textos en ruso o griego el incremento es del 100%, ya que los caracteres empleados son principalmente no ASCII. Para los usuarios japoneses esto significa que los códigos de 16 bits tomarán tres bytes. Si bien existen conversiones algorítmicas de algunos conjuntos de caracteres (especialmente ISO/IEC 8859-1) a Unicode, la conversión general requiere el uso de tablas de conversión, que pueden ser bastante grandes para códigos de 16 bits.

Observe que UTF-8 es auto-sincronizante: 10xxxxxx es una cola, y cualquier otro byte es la cabeza de un código. Observe que de la única manera que los bytes ASCII aparecen en un flujo UTF-8 es como ellos mismos. En particular, no hay NULs ('\0') or '/'s incluidos que formen parte de algún código más grande.

Puesto que ASCII, y, en particular, NUL y '/', permanecen inalterados, el núcleo no se entera de que se está empleando UTF-8. No le importa en absoluto para qué son los bytes que está manejando.

La representación de los flujos de datos Unicode se suele gestionar a través de tablas de `subtipo' que hacen corresponder un subconjunto de Unicode a glifos. Internamente el núcleo emplea Unicode para describir el subtipo de letra cargada en RAM de vídeo. Esto significa que en el modo UTF-8 uno puede emplear un conjunto de caracteres con 512 símbolos diferentes. Esto no es suficiente para el japonés, chino o coreano, pero si es adecuado para la mayoría de otros propósitos.

iconv(1), ascii(7), iso_8859-1(7), unicode(7), utf-8(7)

La traducción al español de esta página del manual fue creada por Gerardo Aburruzaga García <gerardo.aburruzaga@uca.es>, Juan Piernas <piernas@ditec.um.es>, Miguel Pérez Ibars <mpi79470@alu.um.es> y Marcos Fouces <marcos@debian.org>

Esta traducción es documentación libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.

Si encuentra algún error en la traducción de esta página del manual, envíe un correo electrónico a debian-l10n-spanish@lists.debian.org.

2 Mayo 2024 Páginas de Manual de Linux 6.8