Unicode: en qué consiste
Las lenguas han permitido transmitir y conservar los conocimientos a lo largo de generaciones. El desarrollo de la escritura facilitó aún más la transferencia de conocimientos.
Muchos de los sistemas de escritura actuales tienen miles de años de antigüedad. Sin embargo, el texto digital es relativamente nuevo. En sus primeros años, la representación digital de texto se centró principalmente en la lengua inglesa. Ahora, una parte considerable de la interacción humana tiene lugar en redes digitales que se extienden por todo el mundo. Las personas intercambian información más allá de barreras lingüísticas y nacionales. A partir de este cambio, hubo un replanteamiento y se creó una estructura unificada para el intercambio de textos de una gran variedad de sistemas de escritura y signos. A su vez, el progreso tecnológico abrió posibilidades completamente nuevas para la representación de caracteres.
Un ejemplo muy visual: piensa en los populares emojis de tu móvil. Estos iconos pueden utilizarse como letras con un teclado especial, casi como si fueran una parte del alfabeto. ¿Cómo funciona? Gracias a Unicode.
- Certificado SSL Wildcard
- Registro privado
- 1 cuenta de correo electrónico por contrato
¿Qué es Unicode?
Unicode es el “estándar universal de codificación de caracteres”, su nombre deriva del término inglés “Universal Character Encoding”. Es un estándar para codificar caracteres en representación binaria. Esto permite almacenar y procesar textos en sistemas digitales.
Unicode es innovador en el sentido de que no está atado a los formatos y codificaciones de un único alfabeto de lenguaje humano. Más bien, Unicode fue creado para servir como un estándar uniforme y representar todos los sistemas de escritura y caracteres desarrollados por el ser humano.
Desde el lanzamiento de Unicode 1.0 a finales de 1991, este estándar ha conseguido su propósito. Los navegadores y los sistemas operativos utilizan Unicode internamente. Con la versión 13.0 publicada por el Consorcio Unicode en 2020, el estándar Unicode abarcaba ya un repertorio de 143 859 caracteres en total.
El Consorcio Unicode es una organización sin ánimo de lucro con sede en California que impulsa la evolución de la norma. Los miembros del consorcio son empresas tecnológicas líderes como Adobe, Apple, Facebook, Google, IBM, Microsoft, Netflix y SAP. El conjunto de caracteres cubierto por la norma Unicode es totalmente congruente con el “Universal Coded Character Set” (UCS), normalizado internacionalmente como ISO/IEC 10646.
Bases técnicas de la codificación de caracteres
Hoy en día, la escritura y los textos están omnipresentes en la vida de cualquier persona. La lectura y la escritura son unas de las primeras habilidades culturales que se aprenden en la escuela. Por este motivo, no es de extrañar que mucha gente dé por sentada la existencia de la escritura digital. Pero ¿cómo funciona exactamente la representación técnica de la escritura? Bienvenido al mundo de la codificación digital de texto.
En primer lugar, es importante entender que toda la información presente en un sistema digital consiste, a un nivel más profundo, en interminables cadenas de ceros y unos. A esto se le denomina “representación binaria”. El código binario es en sí algo similar al alfabeto. Sin embargo, en el código binario solo hay dos “letras”: el cero y el uno. A cada dígito dentro de una secuencia de ceros y unos se le denomina “bit”.
El truco básico de la tecnología de la información digital consiste en mapear los caracteres de diferentes alfabetos como secuencias de ceros y unos. De esta forma, se pueden codificar números y letras, pero también todas sus posibles variantes. En general se habla de “símbolos”. Cuanto más larga sea la secuencia de ceros y unos para la representación de un solo símbolo, más símbolos se podrán representar. El número de símbolos posibles se duplica con cada bit añadido.
Un ejemplo concreto: imaginemos que tenemos “palabras” binarias, que tienen dos bits de longitud. Se podrían codificar cuatro números con ellos:
Palabra de 2 bits | Número |
00 | 0 |
01 | 1 |
10 | 2 |
11 | 3 |
Si añadimos otro bit al principio de la secuencia, el número de palabras bit posibles se duplica. Se trataría de las secuencias de bits ya conocidas, cada una precedida por un cero o un uno. Podríamos codificar ocho números:
Palabra de 3 bits | Número |
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
Una palabra de 8 bits se denomina octeto o byte.
De manera simple, hemos mostrado la codificación de los números como ejemplo. Sin embargo, se utiliza el mismo principio también en sistemas digitales para la codificación de letras o cualquier carácter. Este es un ejemplo muy simplificado de codificación binaria de letras:
Palabra de 3 bits | Letra |
000 | A |
001 | B |
010 | C |
Ten en cuenta que lo explicado anteriormente no tiene nada que ver con las fuentes. Hablamos del modelo interno en base al cual se representan digitalmente los caracteres. La representación gráfica de un carácter se llama glifo. Dependiendo de la fuente utilizada, hay diferentes glifos para el mismo carácter, e incluso dentro de una fuente puede haber varias variantes de un glifo. Como sabes, existen diferentes tamaños de fuente, ligaduras, cursivas, etc. Te mostramos una amplia representación con el mapeo de carácter a glifo:
Representación binaria | Decimal | Carácter codificado | Glifo |
---|---|---|---|
1000001 | 65 | “A” mayúscula del alfabeto latino | A |
1100001 | 97 | “A” minúscula del alfabeto latino | a |
0110000 | 48 | “0” árabe | 0 |
0111001 | 57 | “9” árabe | 9 |
11000100 | 196 | “Ä” mayúscula | Ä |
11000001 | 193 | “Á” mayúscula | Á |
Terminología de la codificación de caracteres
La codificación digital de caracteres abarca una serie de conceptos específicos. En español, existe en parte un uso sinónimo de los diferentes términos. Para poder dar una definición precisa de Unicode, también te mostramos aquí los términos en inglés:
Término | Significado | Término en inglés |
---|---|---|
Conjunto de caracteres | Grupo de caracteres posibles, por ejemplo, dígitos “0-9”, letras “a-z”, etc. | Character set |
Punto de código | Número asignado a un carácter específico dentro del dominio del código. | Code point |
Conjunto de caracteres codificado | Asignación de cada carácter a exactamente un punto de código | Coded character set |
Codificación de caracteres | Proceso de conversión de un carácter a una estructura técnica, por ejemplo, una representación binaria. | Character encoding |
Resumen de las codificaciones de caracteres más comunes
Antes de la llegada de Unicode, existía una gran variedad de codificaciones específicas. La norma era utilizar una codificación distinta para cada lengua o familia lingüística. Esto a menudo llevaba a errores de representación e incoherencias en los datos. Para contrarrestar eso, las nuevas codificaciones de caracteres se modelaron a menudo como la revisión de un estándar existente compatible con versiones anteriores. Por ejemplo, el estándar Unicode actual se basa en la anterior codificación de caracteres ISO Latin-1, que a su vez se basa en la codificación ASCII.
Codificación | Bits por carácter | Caracteres posibles | Conjunto de caracteres |
---|---|---|---|
ASCII | 7 bits | 128 | Letras, números y caracteres especiales del teclado estadounidense, así como caracteres de control para teletipo |
ISO Latin-1 (ISO 8859-1) | 8 bits | 256 | Primeros 128 caracteres como ASCII, otros 128 caracteres para los caracteres especiales de las lenguas europeas |
Universal Coded Character Set 2 (UCS-2) | 16 bits | 65 536 | Caracteres del “Basic Multilingual Plane” (BMP); los primeros 256 caracteres son los de ISO Latin-1 |
Universal Coded Character Set 4 (UCS-4) | 32 bits | 1 114 111 | Caracteres del BMP y otros caracteres; un total de 143 859 caracteres en la versión 13.0 de Unicode; los primeros 256 caracteres como ISO Latin-1 |
UCS Transformation Format 8 Bit (UTF-8) | 8/16/24/32 bits | 1 114 111 | Cualquier carácter de UCS-2 y UCS-4; los primeros 256 caracteres como ISO Latin-1 |
- Certificado SSL Wildcard
- Registro privado
- 1 cuenta de correo electrónico por contrato
Estructura del estándar Unicode
El estándar Unicode define los caracteres y los puntos de código correspondientes para letras, caracteres silábicos, ideogramas, signos de puntuación, caracteres especiales y números. Además del alfabeto latino, se admiten los alfabetos griego, cirílico, árabe, hebreo y tailandés. También acepta las escrituras japonesas (hiragana y katakana), china y coreana (hangul). Presenta a su vez caracteres especiales matemáticos, comerciales y técnicos, así como caracteres de control históricos para teletipo.
Los caracteres se resumen en una serie de tablas de caracteres. A continuación, ofrecemos un resumen de las tablas de caracteres más comunes.
Sistemas de escritura del estándar Unicode
Tabla de caracteres | Contiene, entre otros, estos alfabetos |
---|---|
Sistemas de escritura europeos | Armenio, georgiano, griego y latín |
Sistemas de escritura africanos | Etíope, jeroglíficos egipcios, coptos |
Sistemas de escritura de Oriente Medio | Árabe, hebreo, sirio |
Sistemas de escritura de Asia Central | Mongol, tibetano y turco antiguo |
Sistemas de escritura del sur de Asia | Brahmi, tamil y védico |
Sistemas de escritura del sudeste asiático | Khmer, rohinyá y tailandés |
Sistemas de escritura de Indonesia y Oceanía | Balinés, buginés y javanés |
Sistemas de escritura de Asia oriental | CJK (chino, japonés, coreano), hangul (coreano), hiragana (japonés) |
Sistemas de escritura americanos | Cheroqui, silabario canadiense, osage |
Símbolos y puntuación del estándar Unicode
Tabla de caracteres | Contiene, entre otros, estos signos |
---|---|
Puntuación | Signos de puntuación de la lengua inglesa, signos de puntuación de las lenguas europeas, signos de puntuación CJK |
Símbolos alfanuméricos | Símbolos matemáticos, letras circuladas |
Símbolos técnicos | Símbolos del lenguaje de programación APL, símbolos para el reconocimiento óptico de textos |
Números y cifras | Números mayas, números otomanos siyaq, números de la escritura cuneiforme sumeria |
Símbolos matemáticos | Flechas, operadores matemáticos, formas geométricas |
Emojis y pictogramas | Emoticonos, dingbats, otros pictogramas |
Otros símbolos | Símbolos alquímicos, signos de moneda, signos de ajedrez, dominó y mahjong |
Sistemas de notación | Patrones braille, notación musical, taquigrafía duployana |
¿Para qué se utiliza Unicode?
El estándar Unicode sirve principalmente como base universal para procesar, almacenar e intercambiar textos en cualquier idioma. La mayoría de los componentes de software modernos, como bibliotecas, protocolos, bases de datos, etc., que operan con texto, se basan en Unicode. Te mostramos el abanico de posibles aplicaciones con los siguientes ejemplos:
Sistemas operativos
Unicode es el estándar interno para la asignación de texto en la mayoría de los sistemas operativos modernos. Algunos sistemas operativos, como macOS de Apple, permiten el uso de caracteres Unicode en los nombres de archivos.
Páginas web
La variante Unicode UTF-8 se ha convertido en el estándar para codificar documentos HTML. Ya en 2016, más del 80 % de las páginas web más visitadas del mundo utilizaban UTF-8 para almacenar y mostrar sus documentos HTML. Para el uso de letras no ASCII en los nombres de dominio, se ha establecido el estándar Punycode.
- Creador de páginas web rápido e intuitivo
- Imágenes y textos impactantes, generados en un instante
- Dominio, SSL y buzón de correo electrónico incluidos
Lenguajes de programación
Muchos lenguajes de programación modernos utilizan Unicode como base para procesar el texto. Un avance más reciente es la posibilidad de utilizar caracteres Unicode para nombrar variables y funciones. Esto es posible en ECMAScript/JavaScript, entre otros. Lo representamos en el siguiente código:
let ︎ = true;
let = false;
// …
Bases de datos
La popular y ampliamente utilizada base de datos MySQL es compatible con el conjunto completo de caracteres Unicode con la codificación de caracteres “utf8mb4”. Sin embargo, cuando se utiliza la codificación de caracteres “utf8”, los caracteres cuyo punto de código supera los 3 bytes se pierden.
Fuentes
Las fuentes contienen los glifos utilizados para la representación gráfica del texto. Debido al gran número de caracteres que contiene el estándar Unicode, no hay ninguna fuente que contenga todos los caracteres. Incluso el subconjunto Basic Multilingual Plane solo está completamente cubierto por unas pocas fuentes. He aquí algunos ejemplos:
Fuente Unicode | Glifos | Licencia |
---|---|---|
Noto | Alrededor de 65 000 | Open Font License |
Sun-ExtA/B | Alrededor de 50 000 | Freeware |
Unifont | Alrededor de 63 000 | GNU GPL |
Code2000 | Alrededor de 63 000 | Shareware |
¿Cómo utilizar Unicode?
Muchas veces, los usuarios utilizan Unicode sin saberlo. El texto digital existe en la mayoría de los documentos y aplicaciones como Unicode y puede ser copiado, pegado y editado por el usuario a voluntad. A veces surge la necesidad de que el usuario inserte un carácter Unicode específico en el texto. Hay varias formas de hacerlo, que presentamos a continuación:
Teclados de software especiales
El uso de teclados de software especiales es probablemente el método más común para insertar caracteres Unicode en el texto. Omnipresentes en los dispositivos móviles, los teclados de software permiten cambiar de idioma y utilizar sus correspondientes alfabetos. Esto cambia la asignación de teclas, con todos los caracteres procedentes del repertorio Unicode. Los caracteres pueden mezclarse y combinarse entre sí en los textos.
Un buen ejemplo de ello son los emojis: en Unicode, los emojis son caracteres frecuentes como letras, números y caracteres especiales. Como es habitual en los caracteres digitales, la representación de los emojis es independiente de su modelado interno. Cada sistema operativo representa los emojis de una manera ligeramente diferente.
Los útiles teclados de software no solo se encuentran en los dispositivos móviles. También están presentes en el escritorio. Se pueden abrir fácilmente en Windows, macOS, y muchas distribuciones de Linux y muestran un conjunto diferente de caracteres en función del idioma seleccionado. Como el número de teclas es limitado, no se representan todos los caracteres Unicode. Se ofrece más bien una selección de los caracteres más comunes según el idioma.
Tablas de caracteres Unicode
Además de los teclados de software, las tablas de caracteres Unicode son probablemente la forma más útil de acceder a los caracteres Unicode. Como recordatorio, un conjunto de caracteres codificados (“Coded character set”) es el conjunto de todos los caracteres junto a sus puntos de código únicos correspondientes. Para una estructura de este tipo, la disposición en forma de tabla es muy útil, y de hecho el estándar Unicode incluye exactamente estas tablas, llamadas Code Charts. Por un lado, se pueden copiar caracteres específicos de estas tablas para utilizarlos en otros lugares. Por otro lado, los usuarios pueden leer el punto de código correspondiente, por ejemplo, para utilizarlo como una referencia de carácter numérico.
Muchos sistemas operativos de escritorio también contienen una tabla de caracteres Unicode. Esta ofrece una visión general de todos los caracteres Unicode disponibles, incluidos el punto de código, la descripción y el glifo. Se puede insertar o copiar cualquier carácter con un clic. También se puede crear una tabla de caracteres con unas pocas líneas de código. Más adelante en este artículo te mostraremos un ejemplo en el lenguaje de programación Python.
Referencia de carácter numérico
El estándar Unicode se centra en la asignación de caracteres a puntos de código. Si conoces el punto de código de un carácter, puedes utilizarlo para insertar el carácter correspondiente en diferentes contextos. En Windows, la inserción de símbolos Unicode se realiza desde el teclado hardware normal utilizando una combinación de teclas especial. Ten en cuenta que el número de puntos de código debe introducirse normalmente en notación hexadecimal.
La mayoría de las veces, los programadores necesitan las referencias de caracteres numéricos. La representación hexadecimal de los puntos de código permite mapear un carácter Unicode en caracteres del conjunto ASCII. Aquí mostramos el procedimiento en HTML; en principio, esto funciona igual de bien en Python, C++, etc.
El esquema general para incluir un carácter por referencia numérica incluye la referencia en sí, así como una terminación de apertura y cierre. En los documentos HTML, la referencia numérica se abre con “&#x” y se cierra con “;”. En medio, se introduce el punto de código hexadecimal de dos a cuatro caracteres sin espacios. El resultado es el patrón “&#xNNNN;”.
Por ejemplo, para introducir el signo de copyright “©” en un documento HTML, se procede de la siguiente manera:
- Se busca el carácter en una tabla Unicode
- Se obtiene el punto de código asociado al carácter
En el caso de nuestro ejemplo, el punto de código se especifica como “U+00A9”, que es la representación hexadecimal.
- Se compone la referencia de caracteres y se pega en el código fuente HTML o en un documento Markdown
En nuestro caso, introducimos “©”. Esto da como resultado el carácter renderizado “©”.
Otro enfoque relacionado, aunque menos frecuente, permite el uso de puntos de código en notación decimal en lugar de hexadecimal. En este caso, la referencia numérica comienza con “&#” (sin la “x”) y termina con “;” como antes. En el medio, el punto de código se escribe en notación decimal. En el caso de nuestro ejemplo, la referencia numérica es “©” para el signo de copyright.
Utiliza el inspector de caracteres Unicode para obtener rápidamente los diferentes códigos de un carácter
Entidades de carácter
Dado que escribir los caracteres Unicode como referencias numéricas no es intuitivo para los humanos, existe otro método. Se trata de las entidades de carácter. Se definen para los caracteres de uso común y asignan un nombre corto y fácil de recordar al carácter. Una entidad de carácter comienza con el símbolo et (&) y termina con un punto y coma (;). Entre ellos, el nombre definido se coloca sin espacios. Para insertar el signo de copyright “©” en HTML, basta con escribir “©”.
La lista completa de entidades de carácter definidas está disponible en estándar HTML
Lenguajes de programación
La mayoría de los lenguajes de programación contienen funciones básicas que pueden utilizarse para convertir caracteres y puntos de código. Las funciones correspondientes suelen llamarse “ord(carácter)” y “chr(punto de código)”. Se aplica lo siguiente:
'chr(ord(carácter)) == Carácter'
Ten en cuenta que siempre es posible determinar el punto de código correspondiente a un carácter. Por el contrario, el mapeado solo funciona para los números que se definen realmente como puntos de código de caracteres. Aquí mostramos el esquema básico utilizando un breve ejemplo de Python:
# Determinar el punto de código decimal de un carácter
ord('A') # `65`
# Determinar el punto de código hexadecimal de un carácter
hex(ord('A')) # `0x41`
# Determinar el carácter que pertenece al punto de código
chr(65) # `'A'`
chr(0x41) # `'A'`
chr(0x110001) # Error, ya que el punto de código > `0x110000`
Con la ayuda de estas funciones, es posible crear fácilmente una tabla de caracteres para los puntos de código del conjunto de caracteres Unicode. Esto se hace iterando los puntos de código y emitiendo los caracteres correspondientes. Con Python, esto se hace en unas pocas líneas de código:
# `range` comienza en `32` porque los caracteres de control salen con un valor menor
# Establecer conjunto de caracteres ASCII
for code_point in range(32, 128):
# Establecer ISO Latin-1
for code_point in range(32, 256):
# Punto de código de salida en representación decimal y hexadecimal junto con el carácter asociado
print(code_point, hex(code_point), chr(code_point))
Biblioteca de programas ICU
Los componentes internacionales para Unicode (“International Components for Unicode”, ICU), se combinan en una biblioteca de programas proporcionada por el Consorcio Unicode. La biblioteca se publica bajo una licencia de código abierto y puede utilizarse en muchos sistemas operativos. El software se utiliza para la internacionalización programática (“internationalization”, a menudo abreviado como “i18n”). Sus áreas de aplicación incluyen:
- Tratamiento de textos Unicode
- Soporte de expresiones regulares en Unicode
- Análisis y formato de los datos del calendario, la hora, los números, las monedas y los mensajes
La biblioteca ICU está disponible en dos versiones:
- “icu4c” está escrito en C/C++ y proporciona una API para estos lenguajes.
- “icu4j” está escrito en Java y proporciona una API para este lenguaje.
El uso de los componentes ofrece resultados consistentes independientemente de la plataforma subyacente.
Especificación del conjunto de caracteres en la cabecera de los documentos HTML
La mayoría de los documentos HTML actuales están codificados en UTF-8. Para garantizar que el documento se muestre al visitante de la página sin caracteres incorrectos, debe especificarse una meta “charset” en la cabecera del documento HTML. Esto le dice al navegador que interprete el documento cargado como UTF-8, y tiene la siguiente apariencia:
<head>
<meta charset=“utf-8”>
<!—otros elementos de la cabecera -->
</head>
Fuentes de Twitter
La popular red social Twitter no permite formatear el texto de los tweets, perfiles o nombres de usuario. Así, las posibilidades creativas de los usuarios son limitadas. Sin embargo, desarrolladores ingeniosos han encontrado un truco: Twitter se basa en Unicode en todo momento, por lo que es posible componer texto con apariencia de formato a partir de caracteres especiales. Se utilizan caracteres que se asemejan a letras latinas. La forma más fácil de crear un texto de este tipo es con un generador de fuentes para Twitter.