“UTF-8” es la abreviatura de “8-bit UnicodeTransformation Format” y designa a la codificación de caracteres más extendida en la World Wide Web. El estándar internacional Unicode incluye tanto signos lingüísticos como elementos textuales de (casi) todos los idiomas, para el procesamiento electrónico de datos. Por ello, los códigos UTF-8 desempeñan para Unicode un papel fundamental.

Crear una página web
Estás de suerte, tu página web ahora con IA
  • Creador de páginas web rápido e intuitivo
  • Imágenes y textos instantáneos con SEO optimizado por IA
  • Dominio, SSL y buzón de correo electrónico incluidos

El desarrollo de la codificación UTF-8

UTF-8 es una codificación de caracteres que le asigna una cadena de bits determinada, a cada carácter Unicode y que puede leerse como un número binario. Esto significa que UTF-8 asigna un número binario fijo a todas las consonantes, cifras y símbolos de una creciente variedad de idiomas. Los organismos internacionales para los que son importantes los estándares de Internet y que, por tanto, quieren establecer, están trabajando para hacer que UTF8 alcance un tamaño indiscutible para la codificación, entre otros, tanto el W3C como el Internet Engineering Task Force (IETF). De hecho, en el 2009, la mayoría de páginas web de todo el mundo ya estaban utilizando la codificación UTF-8. Según un informe de W3Techs, en abril de 2025 el 98,6 % de todas las páginas web ya utilizaban esta codificación de caracteres.

Problemas anteriores a la introducción de UTF 8

Diferentes zonas con idiomas similares desarrollaron, en su momento, sus propios estándares de codificación debido a sus diferentes pretensiones. En los países de habla inglesa, por ejemplo, solo era necesario el código ASCII, cuya estructura permite asignar 128 caracteres a una cadena de caracteres legible por ordenador.

Sin embargo, los caracteres asiáticos o el alfabeto cirílico utilizan más caracteres individuales únicos y algunos idiomas tienen caracteres que no existen en ASCII. Además, la asignación de diferentes codificaciones podía incluso duplicarse, lo que dio lugar a que, por ejemplo, un documento redactado en ruso se visualizara en un ordenador estadounidense con el sistema de caracteres latinos asignados al sistema, en lugar de con caracteres cirílicos. Las incoherencias resultantes dificultaron considerablemente la comunicación internacional.

Orígenes de UTF-8

Para solucionar esta problemática, Joseph D. Becker desarrolló para Xerox entre 1988 y 1991 el juego de caracteres universal Unicode. A partir de 1992, el consorcio industrial de TI X/Open también comenzó a buscar un sistema para sustituir a ASCII y así, ampliar el repertorio de caracteres, aunque la codificación tenía que seguir siendo compatible con ASCII.

La primera codificación, que recibió el nombre de UCS-2, no cumplía con este requisito, pues transfería los números de caracteres en valores de 16 bits. UTF-1 también fracasó, en parte, por el conflicto de las asignaciones Unicode con las asignaciones de caracteres ASCII ya existentes. Como resultado, un servidor configurado basándose en ASCII ofrecía caracteres erróneos, lo que se convirtió en un problema considerable, puesto que en dicha época este era el sistema con el que trabajaban la mayoría de ordenadores en lengua inglesa.

El siguiente avance fue el File System Safe UCS Transformation Format (FSS-UTF) de Dave Prosser, que eliminó la superposición con caracteres ASCII. En agosto de ese mismo año, el borrador fue pasando por las manos de círculos expertos. En los Bell Labs, trabajaban en el sistema operativo Plan 9, los cofundadores de Unix Ken Thompson y Rob Pike, conocidos por haber obtenido varios Premios Nobel. Basándose en la idea de Prosser, desarrollaron una codificación autosincronizada (cada carácter indica los bits que necesita) y establecieron reglas para la asignación de las consonantes que podían representarse de forma distinta en el código (por ejemplo, “ü” como carácter único o “u + ¨”. De esta manera, utilizaron la codificación con éxito para su sistema operativo y se lo presentaron a las personas responsables. Así fue como se desarrolló FSS-UTF, hoy en día conocido como “UTF-8”.

UTF-8 en el juego de caracteres Unicode: un estándar para todos los idiomas

La codificación UTF-8 es un formato de transformación del estándar Unicode. El estándar internacional ISO 10646 define a Unicode a grandes rasgos con el nombre de “Universal Coded Character Set”. Los desarrolladores de Unicode, por su parte, delimitan ciertos parámetros para su aplicación práctica. No obstante, el estándar tiene como objeto garantizar la codificación uniforme y compatible a nivel internacional de caracteres y elementos textuales.

En su introducción en 1991, Unicode definió 24 sistemas de escritura modernos y signos de moneda para el procesamiento de datos. En el estándar Unicode publicado en 2024, el número aumentó a 168. Existen varios formatos de transformación Unicode, conocidos como “UTF”, que permiten reproducir los 1.114.112 posibles puntos de código (codepoints). Tres formatos se han impuesto: UTF-8, UTF-16 y UTF-32. Otras codificaciones como UTF-7 o SCSU, aunque tienen sus ventajas, no han logrado consolidarse. Unicode está dividido en 17 niveles, cada uno con 65.536 caracteres. Cada nivel consta de 16 columnas y filas. El nivel cero, la Basic Multilingual Plane (BMP), abarca la mayoría de los sistemas de escritura actualmente utilizados en el mundo, así como signos de puntuación, caracteres de control y símbolos. Actualmente, se utilizan seis niveles más:

  • Supplementary Multilingual Plane (capa 1): sistemas de escritura históricos, caracteres no muy utilizados
  • Supplementary Ideographic Plane (capa 2): caracteres CJK poco habituales (“Chinese, Japanese, Korean” (chino, japonés, coreano))
  • Tertiary Ideographic Plane (capa 3): desde la versión 15.1 de Unicode, se codifican aquí más caracteres CJK (chino, japonés y coreano).
  • Supplementary SpecialPurpose Plane (capa 14): caracteres de control individuales
  • Supplementary Private Use Area – A (capa 15): uso privado
  • Supplementary Private Use Area – B (capa 16): uso privado

Los códigos UTF permiten acceder a todos los códigos Unicode y las características correspondientes se recomiendan para determinados campos de aplicación.

Las alternativas UTF-32 y UTF-16

UTF-32 siempre trabaja con 32 bits, es decir, 4 bytes y su estructura simple aumenta la legibilidad del formato. En los idiomas, en concreto los que tienen el alfabeto latino y solo utilizan los primeros 128 caracteres, la codificación utiliza más memoria de la necesaria (4 bytes en lugar de 1).

UTF-16 se estableció como formato de presentación en sistemas operativos como Apple macOS y Microsoft Windows. Sin embargo, también se aplica en muchos frameworks de desarrollo de software, siendo uno de los UTF más antiguos que todavía siguen utilizándose. Su estructura es especialmente apta para ahorrar espacio en la codificación de caracteres lingüísticos no latinos. La mayoría de caracteres se representan con 2 bytes (16 bits) y pocas veces se duplica la longitud a 4 bytes.

Eficiente y escalable: UTF-8

UTF-8 está compuesto por hasta cuatro cadenas de bits formadas por 8 bits respectivamente y su antecesor ASCII consta de una cadena con 7 bits. Ambas codificaciones definen los primeros caracteres codificados de forma congruente, pero lo esencial de los caracteres para la lengua inglesa es que están cubiertos por un byte. Para los idiomas con el alfabeto latino, este formato es el que utiliza el espacio de almacenamiento de la manera más eficiente posible, por lo que los sistemas operativos Unix y Linux lo utilizan de forma interna. El papel más importante de UTF-8 está relacionado con las aplicaciones de Internet a la hora de visualizar texto en la World Wide Web o en correos electrónicos.

Gracias a una estructura con capacidad para autosincronizarse, la legibilidad se mantiene a pesar de la longitud variable por carácter. Sin las restricciones de Unicode, UTF-8 permite asignar UTF-8 4.398.046.511.104 caracteres, pero con la limitación de 4 bytes de Unicode solo resultan efectivos 221, lo que es más que suficiente. El rango de Unicode tiene, además, capas vacías para muchos otros sistemas de escritura. La asignación exacta evita el solapamiento de puntos de código, lo que restringía la comunicación en el pasado.

Mientras que UTF-16 y UTF-32 también permiten una asignación exacta, UTF-8 utiliza el espacio de almacenamiento para el sistema latino de un modo especialmente eficiente y está diseñado para que diferentes sistemas de escritura puedan coexistir sin problemas y para darles cobertura. Esto permite la visualización simultánea y significativa en campos de texto sin problemas de compatibilidad.

Aspectos básicos: la codificación UTF-8 y su composición

Por un lado, la codificación UTF-8 sorprende por la compatibilidad retrógrada con ASCII y, por otro, por una estructura capaz de autosincronizarse que les facilita a los desarrolladores la tarea de atisbar fuentes de error retrospectivamente. UTF utiliza solo 1 byte para todos los caracteres ASCII y el número total de cadenas de bits puede identificarse en las primeras cifras del número binario. Dado que el código ASCII solo comprende 7 bits, el código es 0. El 0 completa el espacio de memoria hasta llegar a un byte entero y señaliza el inicio de una cadena sin cadenas sucesivas. El nombre “UTF-8” se expresa, por ejemplo, como número binario con la codificación UTF-8 de la siguiente manera:

Carácter U T F - 8
UTF-8, binario 01010101 01010100 01000110 00101101 00111000
Punto de Unicode, hexadecimal U+0055 U+0054 U+0046 U+002D U+0038

La codificación UTF-8 asigna una única cadena de bits a los caracteres ASCII como los empleados en la tabla. Los siguientes caracteres y símbolos dentro de Unicode tienen de dos a cuatro cadenas de 8 bits. La primera cadena recibe el nombre de byte de inicio y las cadenas siguientes son bytes sucesivos. Los bytes de inicio con bytes sucesivos siempre empiezan por 11 y los bytes sucesivos por 10. Si se busca un determinado punto en el código manualmente, puede reconocerse el principio de un carácter codificado con los marcadores 0 y 11. El primer carácter multibyte imprimible es el signo de exclamación invertido:

Carácter ¡
UTF-8, binario 11000010 10100001
Punto de Unicode, hexadecimal U+00A1

La codificación de prefijos evita que se codifique un carácter adicional en una cadena de bytes. Si una secuencia de bytes comienza a mitad de un documento, el ordenador seguirá mostrando los caracteres legibles, ya que no visualiza los caracteres incompletos. Si desde el principio buscas un carácter, la limitación de 4 bytes hará que no sea necesario que retrocedas en ningún punto más de tres cadenas de bytes para localizar el byte de inicio:

  • 110xxxxx representa 2 bytes
  • 1110xxxx representa 3 bytes
  • 11110xxx representa 4 bytes

En Unicode, el valor del byte asignado se corresponde con el número del carácter, lo que permite un orden léxico, aunque hay algunas brechas. El rango de Unicode comprendido entre U+007F y U+009F comprende números de control no asignados. Así, el estándar UTF-8 no asigna caracteres imprimibles, sino solo comandos.

Como ya se ha señalado, la codificación UTF-8 puede, en teoría, enlazar cadenas de hasta 8 bytes. Sin embargo, Unicode requiere una longitud de máximo 4 bytes. Esto tiene, por un lado, como consecuencia que las cadenas de bytes con 5 bytes o más no suelen ser válidas. Por otro, esta limitación es reflejo del afán de crear un código lo más compacto (con bajo consumo de memoria) y estructurado posible. Así, una norma fundamental al emplear UTF-8 es que siempre debe utilizarse la codificación más corta posible.

Nota

Esta regla es la razón por la que las secuencias de bytes que comienzan con 192 y 193 no son válidas. Esto se debe a que representan potencialmente caracteres en el rango ASCII (0–127) con 2 bytes, cuando ya están codificados con 1 byte.

Sin embargo, para algunos caracteres existen múltiples codificaciones equivalentes. Por ejemplo, la letra ä se codifica con 2 bytes: 11000011 10100100. Teóricamente, es posible combinar los puntos de código para la letra “a” (01100001) y el signo diacrítico “ ” (11001100 10001000) para representar “ä”: 01100001 11001100 10001000. Aquí se utiliza la llamada forma de normalización Unicode NFD, en la que los caracteres se descomponen de manera canónica. Ambas codificaciones mostradas conducen al mismo resultado (es decir, “ä”) y, por lo tanto, son canónicamente equivalentes*.

Nota

Las normalizaciones sirven para unificar representaciones Unicode diferentes del mismo carácter. En este contexto, la equivalencia canónica es importante: indica que dos secuencias de caracteres pueden estar codificadas de manera diferente, pero tener el mismo significado y representación. La equivalencia compatible, por otro lado, permite secuencias que se diferencian en formato o estilo, pero son equivalentes en contenido. Las formas de normalización Unicode (por ejemplo, NFC, NFD, NFKC, NFKD) emplean estos conceptos para estandarizar los textos. Esto asegura que las comparaciones, ordenaciones y búsquedas funcionen de manera coherente y confiable.

Hay algunos rangos de valores de Unicode sin definir para UTF-8, pues estos se utilizan para los sustitutos de UTF-16. El cuadro siguiente muestra los bytes de UTF-8 permitidos según el grupo Internet Engineering Task Force (IETF) (en verde se muestran los bytes válidos y en rojo los no válidos).

Imagen: Tabla: Rangos de valores UTF-8
La tabla ofrece una visión general de los rangos de valores UTF-8 válidos.

Conversión de código Unicode hexadecimal a UTF-8 binario

Mientras que los ordenadores solo leen números binarios, las personas usan el sistema decimal. Una interfaz a medio camino entre estas formas es el sistema hexadecimal, que sirve de ayuda para representar cadenas de bits largas, para lo que utiliza cifras entre 0 y 9 y letras de la A a la F y actúa sobre la base del número 16. Como la cuarta potencia de 2, el sistema hexadecimal resulta más apto que el sistema decimal para representar rangos de bytes de 8 dígitos.

Un dígito hexadecimal representa una cadena de cuatro caracteres (“nibble”) en un octeto. Un byte con ocho dígitos binarios también puede representarse con solo dos dígitos hexadecimales. Unicode utiliza el sistema hexadecimal para describir la posición de un carácter en el propio sistema y a partir de aquí pueden calcularse tanto el número binario como el punto de código de UTF-8.

En primer lugar, tiene que convertirse el número hexadecimal y después adaptar los puntos de código a la estructura de la codificación UTF-8. Para facilitar la estructuración puedes utilizar el siguiente cuadro, que muestra el número de puntos de código que tienen cabida en una cadena de bytes y la estructura que puede esperarse en un rango de valores de Unicode determinado.

Tamaño en bytes Bits libres para la determinación Primer punto de código de Unicode Último punto de código de Unicode Byte de inicio / byte 1 Byte sucesivo 2 Byte sucesivo 3 Byte sucesivo 4
1 7 U+0000 U+007F 0xxxxxxx
2 11 U+0080 U+07FF 110xxxxx 10xxxxxx
3 16 U+0800 U+FFFF 1110xxxx 10xxxxxx 10xxxxxx
4 21 U+10000 U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

En un área de código puede asumirse la cantidad de bytes empleados, pues se respeta el orden léxico en la enumeración de los puntos de código de Unicode y de los números binarios de UTF-8. En el rango U+0800 y U+FFFF UTF-8 emplea 3 bytes, por lo que hay disponibles 16 bits para expresar el punto de código de un símbolo. La inclusión de un número binario calculado en el esquema de UTF-8 tiene lugar de derecha a izquierda y los espacios en blanco a la izquierda deben completarse con ceros.

Ejemplo de cálculo:

El símboloᅢ(Hangul Junseong, Ä) se asocia en Unicode con U+1162. Para calcular el número binario es necesario convertir el número hexadecimal en un número decimal. Cada dígito del número se corresponde con la potencia correlativa de 16. La cifra derecha tiene el valor más bajo con 160 = 1. Empezando desde la derecha, multiplica el valor numérico de la cifra con el de la potencia y posteriormente añade los resultados.

Imagen: Cálculo de ejemplo: convertir un número hexadecimal a decimal
En un primer paso, convierte el número hexadecimal a un número decimal.

4450 es el número decimal calculado que tendrá que convertirse en un número binario. Para ello ha de dividirse por 2 hasta que el resultado sea 0. El valor Rest, escrito de derecha a izquierda, es el número binario.

Imagen: Ejemplo: cómo convertir un número decimal a binario
En el siguiente paso, convierte el número decimal a un número binario.

El código UTF-8 especifica 3 bytes para el punto de código U+1162, ya que el punto de código se encuentra entre U+0800 y U+FFFF. El primer byte comienza con 1110. Los dos bytes siguientes comienzan cada uno con 10. Los bits restantes se completan en los bits libres, que no están definidos por la estructura, de derecha a izquierda. Los bits sobrantes en el primer byte se completan con 0 hasta llenar el octeto. La codificación UTF-8 se vería así:

11100001 10000101 10100010 (el punto de código insertado está en negrita)

Carácter Código Unicode, hexadecimal Número decimal Número binario UTF-8
U+1162 Número decimal 4450 1000101100010 111000011000010110100010

UTF-8 en editores

UTF-8 es el estándar más utilizado en Internet. Sin embargo, algunos editores sencillos almacenan texto, pero no necesariamente en este formato. Microsoft Notepad, por ejemplo, utiliza normalmente una codificación conocida como “ANSI”, tras la que se esconde la codificación “Windows-1252” basada en ASCII. Para convertir un archivo de texto de Microsoft Word a UTF-8 (por ejemplo, para reproducir diferentes sistemas de escritura), sigue estos pasos: en “Guardar como” (“Save As”) selecciona la opción “Texto sin formato” (“Plain text”) en Tipo (“Save as type”).

Imagen: Captura de pantalla: guardar documento en Word
Microsoft Word también te permite guardar documentos como textos sin formato.

Se abre la ventana emergente ”Conversión de archivo”. En ”Codificación de texto”, seleccione la opción ”Otra codificación” y de la lista, elija ”Unicode (UTF-8)”. En el menú desplegable ”Finalizar líneas con”, seleccione “Retorno de carro/salto de celda” o “CR/LF”. Así de fácil se convierte un archivo al conjunto de caracteres Unicode con UTF-8.

Imagen: Captura de pantalla: conversión de archivo en Word
Además de UTF-8, en la ventana “Conversión de archivo” también pueden seleccionarse Unicode (UTF-16) con y sin Big Endian o ASCII y muchas otras codificaciones.

Abrir un archivo de texto sin marcar en el que no se sepa de antemano el tipo de codificación utilizado puede ocasionar problemas de edición. En tales casos, Unicode permite recurrir a la “marca de orden de bytes” (Byte Order Mark o BOM). Con este carácter se puede mostrar si el documento tiene formato big endian o little endian. Si un programa decodifica un archivo en UTF-16 little endian con ayuda de UTF-16 big endian, el texto resultante se muestra lleno de errores.

Sin embargo, los documentos basados en el conjunto de caracteres UTF-8 no tienen este problema, pues la cadena de bytes siempre se lee como una secuencia big endian. En este caso, la BOM muestra que el documento existente está codificado con UTF-8.

Nota

En algunas codificaciones (UTF-16 y UTF-32), los caracteres que se visualizan con más de un byte pueden presentar el byte más relevante en posición delantera (izquierda) o trasera (derecha). Si el byte más importante (“Most Significant Byte”, MSB) está delante, se añade “big endian” a la codificación, pero si está detrás “little endian”.

La BOM se coloca antes de un flujo de datos o al principio de un archivo. Dicha marca tiene prioridad sobre el resto de instrucciones e incluso sobre la cabecera HTTP, pues actúa como un tipo de firma para códigos Unicode y tiene el punto de código U+FEFF. La BOM se presenta de forma diferente en formato codificado en función de la codificación utilizada.

Formato de codificación BOM, codepoint: U+FEFF (hex.)
UTF-8 EF BB BF
UTF-16 big-endian FE FF
UTF-16 little-endian FF FE
UTF-32 big-endian 00 00 FE FF
UTF-32 little-endian FF FE 00 00

No se debe utilizar la marca de orden de bytes (BOM) si el protocolo lo prohíbe explícitamente o si sus datos ya están asignados a un tipo específico. Algunos programas, según el protocolo, esperan caracteres ASCII. Dado que UTF-8 es retrocompatible con la codificación ASCII y su orden de bytes está definido, no necesita la BOM. De hecho, Unicode recomienda no utilizar la BOM con UTF-8. Sin embargo, dado que puede aparecer en código más antiguo y causar problemas, es importante identificar la BOM si está presente.

Tu página web con dominio propio
Crea tu página web en minutos
  • Plantillas profesionales
  • Modificación del diseño con un solo clic
  • Dominio, SSL y correo electrónico
¿Le ha resultado útil este artículo?
Ir al menú principal