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.
Se incluye información acerca de ASCII, GB 2312, ISO 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, Código
Estándar Americano para el Intercambio de Información) es el
conjunto de caracteres original de 7 bits, diseñado inicialmente para
el inglés americano. También llamado ASCII-US. Actualmente se
describe en el estándar ISO 646:1991 IRV.
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 8859 es una serie de 15 conjuntos de caracteres de 8 bits, los cuales tienen
como su primera mitad (7 bits) el ASCII, caracteres de control invisibles en
las posiciones 128 a 159, y 96 gráficos fijos desde la posición
160 hasta la 255.
El más importante es ISO 8859-1 (Alfabeto Latino nº1 / Latin-1).
Fue ampliamente implementado en diversos sistemas y está siendo
gradualmente sustituido por Unicode. Los primeros 256 caracteres de esta
codificación coinciden con los 256 primeros caracteres de Unicode.
El soporte de consola para los otros conjuntos de caracteres 8859 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/VGA y emplean la tabla de tipos de letra de
"correspondencia de usuario" en el controlador de consola.
Aquí se presentan breves descripciones de cada conjunto:
- 8859-1 (Latin-1)
- 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 neerlandesa IJ/ij, de la francesa œ y de las
antiguas comillas alemana „“ se consideraba aceptable.
- 8859-2 (Latin-2)
- 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 ş/ţ.
- 8859-3 (Latin-3)
- Latin-3 fue creado para el esperanto, el maltés y el
turco aunque posteriormente el turco emplearía 8859-9.
- 8859-4 (Latin-4)
- Latin-4 introdujo letras para idiomas del norte de Europa
como el estonio, letón y lituano. Fue reemplazado por 8859-10
(Latin-6) y 8859-13 (Latin 7).
- 8859-5
- 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.
- 8859-6
- Para el árabe. La tabla de glifos 8859-6 es un tipo
fijo de formas de letra separadas, pero un mecanismo de
visualización correcto debería combinar éstas usando
las formas iniciales, medias y finales apropiadas.
- 8859-7
- Fue creado para el griego actual en 1987 y posteriormente
actualizado en el año 2003.
- 8859-8
- 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.
- 8859-9 (Latin-5)
- Ésta es una variante del Latin-1 que reemplaza
letras islandesas con otras turcas.
- 8859-10 (Latin-6)
- 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.
- 8859-11
- Implementa el alfabeto tailandés y es
prácticamente idéntico al estándar TIS-620.
- 8859-12
- Esta codificación no existe.
- 8859-13 (Latin-7)
- Para las lenguas de la Ribera del Báltico; en
particular, incluye los caracteres letones que no se encuentran en
Latin-4.
- 8859-14 (Latin-8)
- É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.
- 8859-15 (Latin-9)
- 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.
- 8859-16 (Latin-10)
- 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.
El KOI8-R es un conjunto de caracteres no ISO popular en Rusia antes de la
aparición de Unicode. La primera mitad es el US ASCII; la segunda es un
conjunto de caracteres cirílico algo mejor diseñado que el ISO
8859-5. KOI8-U está basado en KOI8-R, con un mejor soporte para el
ucraniano. A diferencia de las series ISO 8859 , ninguno de estos conjuntos es
compatible con el estándar ISO-2022.
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 popular en Taiwan para expresar chino
tradicional. (Big5 es tanto un conjunto de caracteres como una
codificación.) Es un superconjunto del ASCII US. Los caracteres no
ASCII se expresan con dos bytes. Los bytes 0xa1–0xfe se usan como
primer byte en los caracteres de dos bytes. Big5 y sus extensiones se usan
ampliamente en Taiwan y Hong Kong. No cumple con el estándar ISO-2022.
JIS X 0208 es un conjunto nacional estándar de caracteres japoneses.
Aunque hay algunos conjuntos nacionales estándares más de
caracteres japoneses (como JIS X 0201, JIS X 0212 y JIS X 0213), éste
es el más importante. Los caracteres se proyectan en una matriz de
94x94 celdas de 2 bytes, donde cada byte se encuentra en el rango
0x21–0x7e. Dese cuenta que JIS X 0208 es un conjunto de caracteres, no
una codificación. Esto significa que el propio JIS X 0208 no se usa
para expresar datos de texto. JIS X 0208 se usa como un componente para
construir codificaciones como EUC-JP, Shift_JIS y ISO-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 con 2 dos bytes, cada
uno de los cuales es el código JIS X 0208 más 0x80.
KS X 1001 es un conjunto nacional estándar de caracteres coreanos. Al
igual que JIS X 0208, los caracteres se proyectan en una matriz de 94x94
celdas de 2 bytes. KS X 1001 se usa como JIS X 0208, como un componente para
construir codificaciones tales como EUC-KR, Johab e ISO-2022-KR. EUC-KR es la
codificación más importante para Linux e incluye ASCII y KS X
1001. KS C 5601 es el antiguo nombre de KS X 1001.
Los estándares ISO 2022 y 4873 describen un modelo de control de tipo de
letra basado en la VT100. Este modelo es (parcialmente) admitido por el
núcleo de Linux y por
xterm(1). Se han definido varias
codificaciones basadas en ISO 2022, sobretodo 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 LS
n hace que el conjunto de caracteres G
n sea el
actual para los códigos con el bit más alto a 0. La
función LS
n hace que el conjunto de caracteres G
n sea
el actual para los códigos con el bit más alto a 1. La
función SS
n hace que el conjunto de caracteres G
n (
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 el conjunto de caracteres G
n 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 del Registro Internacional de Conjuntos de Caracteres
Codificados ISO 2375. Por ejemplo, ESC ( @ selecciona el conjunto de
caracteres ISO 646 como el G0, ESC ( A selecciona el conjunto de caracteres
estándar de R.U. (con la libra esterlina en lugar del signo numeral #),
ESC ( B selecciona el ASCII (con el dólar $ en lugar del símbolo
monetario ¤), ESC ( M selecciona un conjunto de caracteres para lenguas
africanas, ESC ( ! selecciona el conjunto de caracteres cubano, etc. etc. etc.
Un conjunto de 96 caracteres se designa como el conjunto de caracteres G
n 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 G
n 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 4873 estipula un uso más reducido de conjuntos de caracteres, donde
G0 está fijo (siempre ASCII), de modo que G1, G2 y G3 sólo
pueden ser llamados para códigos con el bit más alto a 1. En
particular,
^N y
^O ya no se usan más, ESC ( xx
sólo puede emplearse con xx=B y ESC ) xx, ESC * xx, ESC + xx son
equivalentes a ESC - xx, ESC . xx, ESC / xx, respectivamente.
TIS-620 es un conjunto nacional estándar de caracteres tailandeses y un
superconjunto del ASCII. Al igual que las series ISO 8859, los caracteres
tailandeses se proyectan en el rango 0xa1–0xfe.
Unicode (ISO 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 caracter. 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 10646 de 31
bits, esta progresión continúa hasta códigos de 6 bytes.)
Para la mayoría de los textos que usan los conjuntos de caracteres
ISO-8859, esto significa que los caracteres fuera de ASCII se codifican ahora
con dos bytes. Esto tiende a expandir los ficheros de texto ordinarios en
sólo un 1 o 2%. Para el ruso y el griegos, esto expande los ficheros de
texto ordenarios en un 100%, ya que el texto en estos idiomas se encuentra en
su mayor parte fuera de ASCII. Para los usuarios japoneses esto significa que
los códigos de 16 bits de uso común actualmente
necesitarán tres bytes. Aunque hay conversiones algorítmicas
desde algunos conjuntos de caracteres (esp. ISO-8859-1) a Unicode, una
conversión general requiere trabajar con tablas de conversión
que puede ser bastante grandes para los 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 <
[email protected]>,
Juan Piernas <
[email protected]>, Miguel Pérez Ibars
<
[email protected]> y Marcos Fouces <
[email protected]>
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
[email protected]