🌐

Unicode & UTF-8

El estándar que permite escribir cualquier idioma del mundo en una computadora: árabe, chino, español, emojis 😀 y mucho más.

+1.100.000 caracteres 98% de la web usa UTF-8 Compatible con ASCII 1–4 bytes por carácter

📚 Teoría

¿Qué es Unicode? — El problema que resolvió

En los años 80, cada empresa y cada país tenía su propia tabla de caracteres: ASCII (inglés), ISO-8859-1 (Europa Occidental), Windows-1252 (Microsoft), GB2312 (chino), Shift-JIS (japonés)… El resultado era caos: un archivo escrito en Windows en Japón se veía como basura en un Mac en Colombia.

Unicode nació en 1991 con una idea simple pero ambiciosa: un único número para cada carácter, sin importar la plataforma, el programa o el idioma. Hoy cubre más de 1.100.000 caracteres de todos los sistemas de escritura del mundo.

🔤
Antes de Unicode
100+ tablas incompatibles. Cada idioma su propio sistema.
🌐
Unicode (1991)
Una tabla universal. Cada carácter tiene un code point único.
Resultado
ñ = U+00F1 en todos los sistemas, idiomas y plataformas.

💡 Un code point es el número que Unicode asigna a cada carácter. Se escribe como U+ seguido de 4 a 6 dígitos hexadecimales. Ejemplo: U+00F1 = ñ, U+1F600 = 😀

UTF-8 — Cómo convierte un code point en bytes

Unicode define qué número es cada carácter. Pero no dice cómo guardarlo en disco o enviarlo por internet. Para eso existen los encodings. El más usado es UTF-8.

UTF-8 es brillante porque usa longitud variable: los caracteres comunes ocupan 1 byte y los más raros usan hasta 4. Así no desperdicia espacio con textos en inglés y aun así soporta todo.

Rango UnicodeBytesPatrón de bitsEjemplos
U+0000 – U+007F1 byte0xxxxxxxA B C 0 1 @ # (ASCII)
U+0080 – U+07FF2 bytes110xxxxx 10xxxxxxá é ñ ü € £ ¿ ¡
U+0800 – U+FFFF3 bytes1110xxxx 10xxxxxx 10xxxxxx中 日 한 → ★ ♥ ♫
U+10000 – U+10FFFF4 bytes11110xxx 10xxxxxx 10xxxxxx 10xxxxxx😀 🎉 ❤️ 🇨🇴 𝕳

Ejemplo paso a paso: ñ (U+00F1) → bytes UTF-8

① Code point
U+00F1
= 11110001 bin
② Rango → 2 bytes
110xxxxx
10xxxxxx
③ Rellenar bits
11000011
10110001
④ En hexadecimal
C3 B1
= ñ en UTF-8 ✅
UTF-8 vs UTF-16 vs UTF-32 — ¿Cuándo usar cada uno?
UTF-8 ✅ Recomendado
  • • 1 a 4 bytes por carácter
  • • Ideal para texto en internet
  • • Compatible con ASCII (1 byte)
  • • Estándar de HTML, JSON, XML
  • • 98% de las páginas web
UTF-16 ⚠️ Uso específico
  • • 2 o 4 bytes por carácter
  • • Usado internamente por Windows
  • • JavaScript usa UTF-16 en memoria
  • • Java y .NET también internamente
  • • No compatible con ASCII directo
UTF-32 ❌ Raramente usado
  • • Siempre 4 bytes por carácter
  • • Más fácil de procesar internamente
  • • Desperdicia espacio en textos largos
  • • Poco usado en producción
  • • Solo en procesamiento interno

💡 Regla simple: Para la web, bases de datos, archivos y APIs → siempre UTF-8. Para programación interna en Java/.NET/JS, el lenguaje maneja UTF-16 automáticamente; tú no tienes que preocuparte.

BOM — Byte Order Mark ¿Qué es esa marca invisible?

El BOM (Byte Order Mark) es una secuencia de bytes invisibles que algunos editores añaden al inicio de un archivo para indicar el encoding y el orden de los bytes.

EncodingBOM (bytes al inicio)¿Obligatorio?Problema común
UTF-8EF BB BF❌ NO recomendadoPuede romper archivos PHP, CSV, JSON
UTF-16 LEFF FE✅ RecomendadoNecesario para indicar el orden de bytes
UTF-16 BEFE FF✅ RecomendadoNecesario para indicar el orden de bytes
UTF-32 LEFF FE 00 00OpcionalRaramente usado

⚠️ Problema real: Notepad de Windows guardaba archivos UTF-8 con BOM hasta Windows 10. Si tu archivo PHP comenzaba con el BOM (EF BB BF), PHP enviaba esos bytes antes del HTML → error "headers already sent". Solución: guardar como "UTF-8 sin BOM" (VS Code lo hace por defecto).

Emojis y Unicode — ¿Por qué ocupan más espacio?

Los emojis están en el rango U+1F000 a U+1FFFF (llamado "Plano Suplementario Multilingüe"), que requiere 4 bytes en UTF-8. Por eso en MySQL, si usas utf8 en lugar de utf8mb4, los emojis no se guardan — utf8 de MySQL solo soporta hasta 3 bytes.

😀
U+1F600
F0 9F 98 80
4 bytes
🇨🇴
U+1F1E8 U+1F1F4
2 × 4 bytes
8 bytes
❤️
U+2764 U+FE0F
3+3 bytes
6 bytes
A
U+0041
41
1 byte

MySQL utf8 (3 bytes máx)

INSERT INTO mensajes (texto)
VALUES ('Hola 😀');
-- Error: Incorrect string value
-- '\xF0\x9F\x98\x80'

MySQL utf8mb4 (4 bytes) ✅

ALTER TABLE mensajes
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- Ahora sí acepta 😀 🎉 ❤️
Encodings derivados — HTML entities, URL encoding y Base64

🌐 HTML Entities

Forma segura de escribir caracteres especiales en HTML sin que el navegador los interprete como código.

CarácterNombreDecimalHex
<&lt;&#60;&#x3C;
>&gt;&#62;&#x3E;
&&amp;&#38;&#x26;
ñ&ntilde;&#241;&#xF1;
©&copy;&#169;&#xA9;

🔗 URL Encoding (%XX)

Las URLs solo permiten caracteres ASCII seguros. Los demás se codifican como % + dos dígitos hex de su byte UTF-8.

CarácterURL encoded
espacio%20 o +
ñ%C3%B1
á%C3%A1
%E2%82%AC
😀%F0%9F%98%80

📦 Base64

Convierte datos binarios en texto ASCII usando 64 caracteres seguros (A–Z, a–z, 0–9, +, /). Usado para enviar imágenes y archivos en texto.

"Hola" →
SGVsYQ==

"ñ" (C3 B1) →
w7E=

Cada 3 bytes → 4 caracteres Base64. El = al final es relleno (padding).

🔧 Herramientas Interactivas

Escribe cualquier texto y observa cómo se transforma en cada sistema de codificación.

⚡ Ejemplos rápidos — haz clic para cargar en todas las herramientas:

🔢 Codificador UTF-8 — Code point y bytes

Muestra el code point Unicode y los bytes UTF-8 exactos de cada carácter.

Los bytes aparecerán aquí…

🌐 Convertidor HTML Entities

Convierte texto a entidades HTML seguras para usar en código web.

Los entities aparecerán aquí…

🔗 URL Encoding / Decoding

Codifica texto para usar en URLs seguras (como parámetros GET).

El resultado aparecerá aquí…

📦 Base64 Encode / Decode

Convierte texto a Base64 (usado en imágenes en HTML, tokens de autenticación, correos).

El resultado aparecerá aquí…

📊 Comparativa completa — un carácter en todos los sistemas

Escribe UN carácter y ve su representación en todos los sistemas a la vez.

📖 Diccionario de Términos

Unicode
Estándar internacional que asigna un número único (code point) a cada carácter de todos los idiomas del mundo.
Code Point
El número único que Unicode asigna a cada carácter. Se escribe como U+XXXX. Ejemplo: U+00F1 = ñ.
Plano
Grupo de 65.536 code points. Unicode tiene 17 planos (0 al 16). El plano 0 (BMP) contiene la mayoría de los caracteres de uso cotidiano.
UTF-8
Encoding de longitud variable (1–4 bytes). Compatible con ASCII. Estándar de la web. Usado por el 98% de los sitios.
UTF-16
Encoding que usa 2 o 4 bytes. Utilizado internamente por Windows, Java y JavaScript.
UTF-32
Encoding de longitud fija (siempre 4 bytes por carácter). Simple pero ineficiente. Poco usado en producción.
BOM
Byte Order Mark. Secuencia de bytes al inicio de un archivo que indica el encoding y el orden de bytes. En UTF-8 no es recomendable.
Encoding
Sistema que define cómo guardar en bytes los números (code points) de Unicode. UTF-8 es el encoding más popular.
Collation
Reglas de comparación y ordenamiento de texto. En MySQL, utf8mb4_unicode_ci ordena correctamente en español.
utf8mb4
Versión de MySQL que soporta 4 bytes por carácter. La versión utf8 de MySQL solo soporta 3 bytes (no admite emojis).
HTML Entity
Código que representa un carácter especial en HTML. Puede ser por nombre (&ntilde;), decimal (&#241;) o hex (&#xF1;).
URL Encoding
Método para codificar caracteres no ASCII en URLs. Reemplaza cada byte con % seguido de dos dígitos hexadecimales.
Base64
Encoding que convierte datos binarios en texto usando 64 caracteres ASCII seguros. Muy usado en imágenes embebidas, tokens JWT y correos.
Mojibake
Caracteres ilegibles que aparecen cuando un texto se guarda con un encoding y se lee con otro diferente. Ej: "Medellín".
Surrogates
Pares de code points en UTF-16 usados para representar caracteres fuera del BMP (U+10000 en adelante), como emojis.
Normalización
Proceso de unificar representaciones equivalentes de un mismo carácter. Ej: ñ puede ser 1 carácter (U+00F1) o 2 (n + tilde combinada).
charset
Atributo HTML que declara el encoding del documento. Siempre debe ser <meta charset="utf-8"> en la primera línea del head.
Percent-encoding
Otro nombre para URL encoding. Cada byte se representa como %XX donde XX son dígitos hexadecimales.
Padding (=)
En Base64, el símbolo = al final indica relleno para completar el grupo de 3 bytes. Puede aparecer uno (=) o dos (==).
ISO-8859-1
Antiguo estándar de codificación para Europa Occidental. Precursor de Windows-1252. Fue superado por UTF-8.

🎥 Videos Explicativos

Videos en español para reforzar los conceptos.

¿Cómo funciona la codificación de caracteres? ASCII y Unicode

¿Cómo convertir de Unicode a UTF-8? — Proceso paso a paso

Acentos y caracteres especiales en HTML — Entities

¿Qué es el código Base64? — Explicación clara

🧠 Cuestionario

10 preguntas aleatorias del banco de 50. Calificación de 0 a 100.