🌐

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.