Estándares y formatos

Codificación de caracteres: ASCII, UTF-8 y los códigos QR

Por qué el mismo código QR puede mostrar texto ilegible en un teléfono y texto limpio en otro — la codificación de caracteres, explicada.

La codificación de caracteres es el acuerdo invisible que convierte las letras que escribes en los números que un ordenador almacena — y cuando un código QR y un escáner no se ponen de acuerdo sobre qué acuerdo están usando, ese es exactamente el momento en que tus letras acentuadas y tus emojis se convierten en un galimatías ilegible.

¿Alguna vez has escaneado un código QR y has visto que café salía como café? ¿O que un emoji se convertía en una fila de signos de interrogación? Te has topado con un desajuste de codificación de caracteres. Es uno de los duendecillos silenciosos más comunes del mundo QR, y una vez que entiendes ASCII, Latin-1, UTF-8 y un mecanismo llamado ECI, todo cobra sentido. Vamos a desenredarlo. 🐾

Por qué el texto tiene que convertirse en números

Los ordenadores solo almacenan números. Un código QR, en el fondo, contiene un flujo de bits — unos y ceros — que se agrupan en bytes (números del 0 al 255). Para almacenar la letra "A", primero acordamos que "A" equivale a un número concreto y luego almacenamos ese número. La codificación de caracteres es ese acuerdo: una tabla de consulta que asigna caracteres a números y viceversa. Nuestro artículo complementario sobre cómo representan el texto los ordenadores cubre los fundamentos; aquí nos centramos en lo que significa para el QR.

ASCII: los 128 originales

ASCII es el abuelo de las codificaciones. Define 128 caracteres — las letras inglesas mayúsculas y minúsculas, los dígitos, la puntuación común y un espacio — cada uno asignado a un número del 0 al 127. La "A" es 65, la "a" es 97, el "0" es 48, y así sucesivamente. Siete bits bastan para cubrir los 128.

ASCII es sencillo y universal: toda codificación que importa hoy coincide con ASCII para esos primeros 128 caracteres. La pega es lo que le falta — sin letras acentuadas, sin "£" ni "€", sin escrituras no inglesas y, desde luego, sin emojis. Para el inglés simple, ASCII simplemente funciona, y un código QR que solo contiene caracteres ASCII es tan seguro y portable como puede serlo.

Latin-1: rellenando la segunda mitad

Los bytes pueden contener valores del 0 al 255, así que hay sitio para otros 128 caracteres más allá de ASCII. Latin-1 (formalmente ISO-8859-1) usa ese rango superior para añadir muchos caracteres de Europa occidental: "é", "ñ", "ü", "ç", "£" y compañía. Los valores 0–127 siguen siendo idénticos a ASCII; los valores 128–255 llevan los extras.

Latin-1 importa para los códigos QR porque es la suposición predeterminada que hacen muchos escáneres al leer en modo byte. Si los bytes de un código se escribieron como Latin-1 y se leen como Latin-1, el texto acentuado de Europa occidental sale perfecto. Los problemas empiezan cuando un lado supone Latin-1 y el otro supone otra cosa.

UTF-8: una codificación para gobernarlas a todas

UTF-8 es la codificación universal moderna, y es lo que usa la mayor parte de la web. Puede representar cada carácter de Unicode — cada escritura, símbolo y emoji de la Tierra — usando un número variable de bytes por carácter:

  • Los 128 caracteres ASCII siguen usando un solo byte (y son idénticos byte a byte a ASCII).
  • Los caracteres acentuados y muchos caracteres comunes usan dos bytes.
  • Los caracteres menos comunes usan tres bytes.
  • Los emojis y los símbolos más raros usan cuatro bytes.

Esta compatibilidad hacia atrás con ASCII es genial: el texto en inglés simple es idéntico en ASCII y en UTF-8. Pero una "é" en UTF-8 son dos bytes, mientras que en Latin-1 es uno. Esa única diferencia es la raíz de la mayoría de los galimatías en los QR.

La letra "é" es un byte en Latin-1 pero dos bytes en UTF-8. Si un código se escribe de una manera y se lee de la otra, el desajuste aparece como galimatías tipo "é".

Dónde encajan los códigos QR

Los códigos QR tienen cuatro modos de codificación, y el texto suele viajar en modo byte (8 bits por carácter). El modo byte almacena valores de byte en bruto, pero no dice por sí mismo qué conjunto de caracteres representan esos bytes. Nuestra guía sobre los modos de codificación de los códigos QR cubre los cuatro modos; el punto crucial aquí es que el modo byte es donde surge la cuestión de la codificación.

Así que cuando un generador codifica "café" y un escáner lo descodifica, ambos tienen que ponerse de acuerdo sobre el conjunto de caracteres. Si no lo hacen, obtienes mojibake — el nombre técnico (y bastante entrañable) del texto descodificado ilegible.

ECI: declarando el conjunto de caracteres

El estándar QR tiene una solución adecuada: ECI, o Interpretación de Canal Extendido (Extended Channel Interpretation). ECI es un pequeño marcador que el codificador puede colocar en los datos para decir, en efecto, "los bytes que siguen usan el conjunto de caracteres número X" — por ejemplo, UTF-8. Un escáner que entiende ECI lee el marcador e interpreta los bytes correctamente, así que la "é" y los emojis salen como estaba previsto.

El matiz es que no todos los escáneres o generadores manejan ECI a la perfección. Cuando falta ECI, un lector tiene que adivinar. Algunos suponen Latin-1; algunos intentan detectar automáticamente UTF-8; los resultados varían según la app y el teléfono. Esa inconsistencia es por lo que el mismo código puede verse bien en un teléfono e ilegible en otro.

Por qué a veces se estropean los emojis y los acentos

Ahora el misterio se resuelve solo. El galimatías ocurre cuando la codificación usada para escribir el código y la codificación usada para leerlo no coinciden. Escenarios comunes:

  • Escrito en UTF-8, leído en Latin-1. Los dos bytes de una "é" en UTF-8 se leen como dos caracteres Latin-1 separados, produciendo "é".
  • Sin marcador ECI. El escáner adivina el conjunto de caracteres y adivina mal.
  • Emojis por todas partes. Los emojis solo existen en Unicode y necesitan UTF-8; un escáner que supone Latin-1 no puede representarlos y muestra signos de interrogación o cuadros.
  • Escáneres antiguos. Algunos lectores más antiguos no admiten bien ECI ni UTF-8, así que cualquier cosa más allá de ASCII es una apuesta.
CodificaciónCubreBytes por carácterNotas
ASCIILetras inglesas, dígitos, puntuación básica1 (valores 0–127)Universalmente segura
Latin-1ASCII + acentos de Europa occidental1 (valores 0–255)Predeterminada común en QR
UTF-8Todos los caracteres Unicode + emojis1 a 4Estándar web; necesita ECI en el QR para ser fiable

Cómo evitar códigos QR ilegibles

Unos cuantos hábitos amables mantienen tus códigos limpios:

  1. Cíñete al ASCII simple cuando puedas. Las letras inglesas básicas, los dígitos y la puntuación sencilla se descodifican de forma idéntica en todas partes. Esta es la opción más fiable con diferencia.
  2. Usa un generador que añada ECI para UTF-8. Si necesitas acentos o texto no latino, asegúrate de que la herramienta señale UTF-8 mediante ECI para que los escáneres compatibles lo interpreten correctamente.
  3. Prueba en varios teléfonos. Escanea tu código terminado con un par de dispositivos distintos antes de imprimir miles de copias.
  4. Ve con cuidado con los emojis. Son el contenido más frágil entre los distintos escáneres. Preciosos cuando funcionan, arriesgados cuando no.
  5. Codifica en porcentaje los caracteres complicados en las URL. Para los enlaces, usar la codificación de URL estándar para los caracteres especiales evita muchos problemas por completo.

El panorama general

La codificación de caracteres es una de esas ideas fundamentales que tocan todo lo digital, no solo los códigos QR. Si quieres la versión desde cero, nuestras guías sobre cómo representan el texto los ordenadores y los modos de codificación del QR combinan bien con esta. Y para la anatomía de dónde viven realmente estos bytes dentro del cuadrado, consulta la anatomía de un código QR.

Cuando creas un código con QR Puppy, no tienes que preocuparte por la codificación — pero saber qué está pasando bajo el capó te ayuda a detectar problemas pronto. ¿Listo para probar uno? Puedes crear un código QR gratis, estático y estándar, en segundos.

Preguntas frecuentes

¿Por qué mi texto acentuado se convierte en símbolos raros?

Porque el código se escribió en una codificación (a menudo UTF-8) y se leyó en otra (a menudo Latin-1). Una "é" en UTF-8 son dos bytes, que un lector Latin-1 muestra como dos caracteres extraños como "é". Usar ECI para declarar UTF-8, o ceñirse al ASCII simple, lo evita.

¿Puede un código QR contener emojis?

Sí, pero con cuidado. Los emojis requieren UTF-8, y el código debería señalarlo con ECI. Aun así, algunos escáneres no muestran bien los emojis, así que son el contenido menos fiable. Pruébalos ampliamente antes de depender de ellos.

¿Qué es ECI en términos sencillos?

ECI (Interpretación de Canal Extendido) es un pequeño marcador dentro del código QR que le dice al escáner qué conjunto de caracteres usan los bytes, como UTF-8. Ayuda a que los caracteres no ingleses se descodifiquen correctamente en lugar de estropearse — siempre que el escáner admita ECI.

¿El texto ASCII siempre es seguro en un código QR?

En la práctica, sí. Los 128 caracteres ASCII (letras inglesas, dígitos, puntuación básica) se asignan a los mismos valores de byte en ASCII, Latin-1 y UTF-8, así que se descodifican de forma idéntica en prácticamente cualquier escáner. Es el contenido más seguro que puedes usar.

¿Afecta la codificación al tamaño de mi código QR?

Puede hacerlo. UTF-8 usa más bytes para los caracteres acentuados y los emojis (de dos a cuatro cada uno) que ASCII o Latin-1, así que el texto con muchos caracteres especiales produce un código más grande y más denso. Consulta nuestra guía sobre la capacidad de datos para saber cómo la longitud afecta al tamaño.

Crea un código QR de forma honesta 🐾

Gratis para siempre, sin rastreo, sin caducidad — generado en tu propio navegador.

🎨 Crear un código QR →