El juego de caracteres UTF-8

En esta lección se explica qué es un juego de caracteres informático y, concretamente, qué es el juego de caracteres UTF-8 y su uso en HTML.

Esta lección es la primera lección de un grupo de tres lecciones que se recomienda leer en el siguiente orden:

Como complemento a las lecciones anteriores, las páginas siguientes muestran diferentes símbolos Unicode agrupados por temas:

Bits

En informática, los números no se guardan en notación decimal (con las cifras del 0 al 9), sino en notación binaria, utilizando únicamente el 0 y el 1. Como en la notación decimal, para escribir números en la notación binaria se utilizan varias cifras seguidas, pero en este caso utilizando únicamente ceros y unos.

Estos son los primeros números naturales escritos en notación decimal y binaria:

Decimal 0 1 2 3 4 5 6 7 8 ...
Binaria 0 1 10 11 100 101 110 111 1000 ...

La figura siguiente permite ver la notación decimal y binaria de los enteros entre 0 y 255. Para subir o bajar el valor, haga clic en los triángulos:

0 Decimal 0 Binario

En notación decimal, con n cifras podemos escribir 10n números. Es decir, con 1 cifra podemos escribir 10 números (del 0 al 9), con 2 cifras podemos escribir 100 números (del 00 al 99), con 3 cifras podemos escribir 1000 números (del 000 al 999), etc.

En notación binaria, con n cifras podemos escribir 2n números. Es decir, con 1 cifra podemos escribir 2 números (0 y 1), con 2 cifras podemos escribir 4 números (del 00 al 11, es decir, del 0 al 3), con 3 cifras podemos escribir 8 números (del 000 al 111, es decir, del 0 al 7), etc.

A las cifras binarias se les llama bit, es decir el número binario 1001 es un número de 4 bits, de la misma manera que el número decimal 329 es un número de 3 cifras decimales.

Bytes

Para realizar su trabajo más rápido, los ordenadores no trabajan con cifras individuales (bits), sino con varias cifras a la vez. La agrupación más utilizada es el byte, que es la agrupación de 8 bits. Un byte puede representar por tanto 256 valores distintos (28, del 00000000 al 11111111, es decir, del 0 al 255).

A medida que ha avanzado la informática, los ordenadores han ido trabajando con grupos de bits cada vez más grandes. En 1981, el primer PC tenía un procesador que trabajaba con grupos de 8 bits (1 byte). En 1984 los PCs empezaron a utilizar procesadores de 16 bits (2 bytes). En 1985 los PCs empezaron a utilizar procesadores de 32 bits (4 bytes). En 2003 los PCs empezaron a utilizar procesadores de 64 bits (8 bytes). Actualmente (noviembre de 2022) no existen PCs con procesadores de 128 bits (16 bytes), pero algunos componentes de los PCs como las procesadores gráficos ya trabajan con grupos de 256 o incluso 512 bits.

El byte se utiliza en Informática como unidad de medida en el almacenamiento de información (capacidad de los discos duros o memorias). Como las capacidades de los dispositivos son ahora tan grandes, normalmente se expresan en múltiplos que corresponden a potencias de 2. Habitualmente e históricamente estos múltiplos se suelen llamar Kilobytes, Megabytes, Gigabytes, Terabytes, etc. aunque realmente estos nombres no son correctos ya que, en este contexto, Kilo no significa mil (1000), sino 1024, ya que 1024 es una potencia de dos (210= 1024), Mega no significa millón sino 1.048.576 (1024 x 1024), etc. Los nombres correctos para estas unidades son kibibyte (1 KiB = 1024 bytes), mebibyte (1 MiB = 1024 KiB = 1.048.576 bytes), gibibyte (1 GiB = 1024 MiB), tebibyte (1 TiB = 1024 GiB), etc. Estas unidades se definieron en 1998, pero raramente se usan.

Notación hexadecimal

El inconveniente de la notación binaria es que para escribir un número grande se necesitan muchos bits. Una manera de acortar los números en binario es utilizar la notación hexadecimal, que utiliza 16 dígitos distintos (del 0 al 9, A, B, C, D, E y F).

En notación hexadecimal, con n cifras podemos escribir 16n números. Es decir, con 1 cifra podemos escribir 16 números (del 0 a F), con 2 cifras podemos escribir 256 números (del 00 al FF, es decir, del 0 al 255), con 3 cifras podemos escribir 4096 números (del 000 al FFF, es decir, del 0 al 4095), etc.

Pasar de la notación binaria a la hexadecimal (o viceversa) es muy sencillo, porque cada cuatro bits de la notación binaria corresponden a un único carácter hexadecimal.

La figura siguiente permite ver la notación binaria, hexadecimal y decimal de los enteros entre 0 y 255. Para subir o bajar cada bit, haga clic en los triángulos:

0 Binario 0 Hexadecimal 0 Decimal

El juego de caracteres ASCII

En Informática toda la información se guarda en forma numérica, por lo que para guardar caracteres (letras, números, signos de puntuación, etc.) se necesita establecer una correspondencia entre los códigos numéricos y los caracteres. Al conjunto de correspondencias se le llama juego de caracteres. Los primeros ordenadores usaban cada uno su propio juego de caracteres, pero en los años 50 empezaron a proponerse estándares que facilitasen la comunicación entre diferentes sistemas. En los años 60 se creó el código ASCII, que definía 128 caracteres (33 caracteres de control y 95 imprimibles -letras minúsculas, mayúsculas, cifras, puntuación, etc.-) y que se convirtió en el estándar en informática.

La figura siguiente permite ver el carácter correspondiente a cada valor del código ASCII (algunos valores no son visibles).

80 Decimal P ASCII

En el código ASCII cada carácter ocupaba precisamente 1 byte, es decir, 8 bits: 7 bits para codificar los 128 caracteres y 1 bit de paridad para comprobar errores. Ese juego de caracteres era suficiente para el idioma inglés, pero era insuficiente para otros idiomas, por lo que a medida que la informática se extendía por el mundo se tuvieron que crear otros juegos de caracteres.


Una forma de ampliar los caracteres disponibles manteniendo el tamaño de un byte por carácter fue abandonar el bit de paridad y utilizar los ocho bits para codificar caracteres. De esa manera el juego de caracteres podía contener 256 caracteres distintos. Los primeros 128 eran los de ASCII, pero los siguientes se podían utilizar para incluir otros caracteres. El más utilizado de esos juegos es el ISO 8859-1, que incluye los caracteres que necesitan los idiomas de Europa occidental (acentos agudos, graves, diéresis, etc.). Windows utiliza un juego de caracteres, el Windows-1252, que tiene algunos caracteres distintos, pero que se suele considerar equivalente.

La figura siguiente permite ver el carácter correspondiente a cada valor del juego de caracteres Windows-1252 (algunos valores no son visibles).

126 Decimal ~ CP1252


Pero pronto los juegos de caracteres de un byte se encontraron con barreras importantes:

El juego de caracteres universal: Unicode

La llegada de Internet y el aumento consiguiente del intercambio de información entre diferentes países hizo aún más patente la necesidad de creación de un juego de caracteres universal, que abarcara las necesidades de toda la humanidad. La idea se empezó a trabajar en 1987 y en 1991 se publicó la primera versión de Unicode,

La principal ventaja de Unicode es que permite que la información guardada pueda ser interpretada correctamente por cualquier sistema informático. Por esa razón, cualquier comunidad tiene interés en incluir su sistema de escritura en Unicode, no solamente las lenguas en uso actual sino también las lenguas muertas, símbolos y pictogramas. Por ello Unicode no ha dejado de crecer y la última versión publicada en septiembre de 2023, Unicode 15.1, contiene casi 150.000 caracteres.

Las primeras versiones de Unicode se publicaron más o menos cada dos años pero desde 2009 Unicode se publica anualmente. La versión 14.0 se publicó con seis meses de retraso debido a la epidemia del coronavirus Covid-19 y desde entonces Unicode se publica en el tercer trimestre de cada año (en principio, en septiembre).

Versiones de Unicode Unicode 1990 1995 2000 2005 2010 2015 2020 2025 1 1.1 2 2.1 3 3.1 3.2 4 4.1 5 5.1 5.2 6 6.1 6.2 6.3 7 8 9 10 11 12 12.1 13 13.1 14 15 15.1 16

La primera versión de Unicode utilizaba dos bytes para codificar cada carácter, pero con el paso del tiempo los dos bytes se quedaron cortos y la norma actual utiliza cuatro bytes para codificar los caracteres. El inconveniente de utilizar 4 bytes para codificar los caracteres es que se ocupa cuatro veces más espacio que codificando con un byte y se necesita cuatro veces más tiempo para transmitirlos. Para optimizar, se decidió que los primeros valores de Unicode coincidieran con los de ASCII, de manera que los textos ingleses pudieran seguir utilizando un byte por carácter. Aunque el tema es bastante complejo, se puede resumir en que existen tres opciones:

Notas:

La tabla siguiente muestra algunos caracteres codificados en Windows-1252, UTF-8, UTF-16 o UTF-32 (big y little endian):

Carácter a á e é 𝄞
CP1252 61 E1 65 E9 80
UTF-8 61 C3 A1 65 C3 A9 E2 82 AC F0 9D 84 9E
UTF-16 (BE) 00 61 00 E1 00 65 00 E9 20 AC D8 34 DD 1E
UTF-16 (LE) 61 00 E1 00 65 00 E9 00 AC 20 34 D8 1E DD
UTF-32 (BE) 00 00 00 61 00 00 00 E1 00 00 00 65 00 00 00 E9 00 00 20 AC 00 01 D1 1E
UTF-32 (LE) 61 00 00 00 E1 00 00 00 65 00 00 00 E9 00 00 00 AC 20 00 00 1E D1 01 00

Se puede consultar el juego de caracteres Unicode completo, dividido en secciones correspondientes a sistemas de escritura y conjuntos de símbolos.

Anuncio de nuevas versiones Unicode: 5.2 (2009) - 6.0 (2010) - 6.1 (2012) - 6.2 (2012) - 6.3 (2013) - 7.0 (2014) - 8.0 (2015) - 9.0 (2016) - 10.0 (2017) - 11.0 (2018) - 12.0 (2019) - 12.1 (2019) - 13.0 (2020) - 13.1 (2020) - 14.0 (2021) - 15.0 (2022) - 15.1 (2023)

Juegos de caracteres en páginas web

En las primeras versiones de HTML se especificaba que el juego de caracteres utilizado por las páginas web debía ser el juego de caracteres ISO 8859-1, más conocido como Latin-1.

En 1997 con la norma RFC 2070 se permitió el juego de caracteres ISO 10646 (equivalente a Unicode).

En 2008 UTF-8 ya era el formato más utilizado en la web.

Desde 2014 la recomendación HTML 5 especifica que UTF-8 es el juego caracteres predeterminado.

Tipos de letra Unicode

Para poder mostrar los caracteres Unicode, se necesita disponer de tipos de letra que los incluyan. Cada sistema operativo incluye sus propios tipos de letra predeterminados, que poco a poco van incluyendo más caracteres Unicode, con más o menos retraso con respecto a la norma.

Existen algunos proyectos de creación de tipos de letra libres que incluyan al menos los caracteres de Unicode que corresponden a pictogramas. El problema es que las fuentes en color pueden usar hasta cinco formatos distintos (SBIX, COLRv0, COLRv1, SVG-in-OpenType, CBDT/CBLC) cuyo soporte es bastante desigual. Actualmente (noviembre de 2023), Firefox admite COLRv0, COLRv1 y SVG-in-OpenType, mientras que Chrome admite SBIX, COLRv0, COLRv1 y CBDT/CBLC [ChromaCheck permite comprobar el soporte de esos formatos en el navegador].

Estas fuentes se pueden emplear en una página web utilizando el mecanismo de las fuentes web, que se comenta en la lección CSS: Fuentes web

Otros proyectos parecen prácticamente abandonados o se han convertido en proyectos comerciales:

Pictogramas en Unicode

Unicode no solamente contiene caracteres para todas las lenguas del mundo, sino que también incluye una gran cantidad de pictogramas. Una gran parte de ellos son símbolos gráficos e iconos de amplia difusión que ya estaban incluidos en juegos de caracteres anteriores, pero desde 2009 (Unicode 5.2) se están incorporando también imágenes más sofisticadas, como los emoticonos o los emojis, creados en Japón a finales de los 90 para los dispositivos móviles. Además, mediante el mecanismo de las secuencias de caracteres, introducido en Unicode 4.1 (2005), se han ido añadiendo nuevos dibujos, como las banderas, y especialmente las variantes de género, color de piel o grupos de individuos

Unicode contiene así miles de pictogramas, que se irán ampliando en las próximas versiones (véase Unicode roadmap).

Estos son, por ejemplo, los emojis añadidos en las últimas versiones de Unicode: 15.1 (2023) - 15.0 (2022) - 14.0 (2021) - 13.1 (2020) - 13.0 (2020) - 12.1 (2019) - 12.0 (2019) - 11.0 (2018)

Estos son algunas de las tablas de caracteres de Unicode que contienen pictogramas:

Para saber más