Guías Desarrollo

Cómo funcionan Unicode y UTF-8

Puntos de código, planos y codificaciones explicados: cómo guarda UTF-8 los caracteres en 1 a 4 bytes (con una tabla comprobada), qué son los pares sustitutos de UTF-16, por qué é puede ser uno o dos puntos de código y cómo evitar el mojibake.

Última revisión:

AdSense Placeholder
Slot: header_reference_page
En esta página

Unicode asigna a cada carácter un número llamado punto de código, que se escribe U+0041 para la A. Hay 1 114 112 puntos de código posibles, repartidos en 17 planos de 65 536. Una codificación como UTF-8 o UTF-16 convierte los puntos de código en bytes. Busque caracteres con Inspector de Caracteres Unicode y limpie texto con Normalizador Unicode; la entrada del glosario es Unicode.

UTF-8 en una tabla

UTF-8 es retrocompatible con ASCII (los primeros 128 puntos de código ocupan un byte, idéntico a ASCII), se autosincroniza (se puede hallar el límite de un carácter desde cualquier byte) y es la opción por defecto en la web. UTF-16 usa 2 bytes para la mayoría de caracteres y un par sustituto de dos unidades de 2 bytes para los puntos de código por encima de U+FFFF, como los emoji.

Intervalo de puntos de código Bytes Patrón de bits
U+0000 → U+007F 1 0xxxxxxx
U+0080 → U+07FF 2 110xxxxx 10xxxxxx
U+0800 → U+FFFF 3 1110xxxx 10xxxxxx 10xxxxxx
U+10000 → U+10FFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Ejemplos comprobados

Carácter Punto de código UTF-8 (hex) UTF-16 (hex)
A U+0041 41 0041
é U+00E9 c3 a9 00e9
€ U+20AC e2 82 ac 20ac
😀 U+1F600 f0 9f 98 80 d83d de00

Un carácter, varios puntos de código

  • é puede ser un punto de código (U+00E9) o dos: e más un acento agudo combinante (U+0301). El texto se ve igual pero su longitud es 1 o 2, y una comparación simple falla. La normalización convierte ambos a una sola forma: NFC compone, NFD descompone; NFKC y NFKD también unifican los caracteres de compatibilidad (fi pasa a fi, ² pasa a 2).
  • Lo que la gente ve como un carácter (un grupo de grafemas) puede ser muchos puntos de código: el emoji de familia son 5 puntos de código unidos por conectores de ancho cero y ocupa 18 bytes en UTF-8.
  • La longitud de una cadena depende de la unidad: bytes, unidades UTF-16, puntos de código o grafemas pueden diferir para el mismo texto.

Mojibake y otras trampas

  • Mojibake: bytes UTF-8 leídos como Latin-1 convierten naïve en naïve. Declare siempre la codificación (<meta charset="utf-8">, una cabecera HTTP o el ajuste del editor).
  • Los caracteres invisibles (espacios de ancho cero, controles bidireccionales) pueden esconderse en texto copiado y en identificadores; encuéntrelos con Detector de Caracteres Invisibles.
  • Parecidos: la а cirílica no es la a latina. Los nombres de dominio lo resuelven con Punycode, vea Punycode.
  • Una marca de orden de bytes UTF-8 (EF BB BF) al principio de un archivo está permitida, pero casi siempre sobra.

Pruebe estas herramientas

Véase también

  • Glosario Unicode
    Unicode es el estándar universal que da a cada carácter de los sistemas de escritura del mundo, además de símbolos y emojis.
  • Glosario UTF-8
    UTF-8 es la codificación Unicode dominante: escribe cada carácter con uno a cuatro bytes y es idéntica a ASCII en los primeros 128.
  • Glosario ASCII
    ASCII es una codificación de caracteres de 7 bits que asigna los números 0 a 127 a letras inglesas, dígitos.
  • Glosario Punycode
    Punycode es la codificación que permite guardar en el DNS, que solo admite ASCII, nombres de dominio con caracteres no ASCII.
  • Glosario Normalización Unicode
    La normalización Unicode convierte en una sola forma estándar el texto que puede escribirse de más de una manera, como una letra acentuada.
  • Hoja de referencia Guía rápida de la tabla ASCII
    Los 95 caracteres ASCII imprimibles con su código decimal y hex.
  • Hoja de referencia Entidades HTML
    Las entidades HTML que de verdad se usan, con nombre, código decimal y significado, qué cinco caracteres escapar y cómo se decodifican.

Preguntas frecuentes

El archivo es UTF-8 pero se leyó como Latin-1 (o Windows-1252). Cada byte se mostró como un carácter propio. Ábralo de nuevo eligiendo UTF-8 como codificación.

AdSense Placeholder
Slot: footer_leaderboard