Skip to content
Empieza gratis

¿Qué es UTF-8 y por qué una "é" ocupa dos bytes?

Predice cuántos bytes ocupa una letra con acento en UTF-8 y en Windows-1252, y córrelo para ver la diferencia.

Curso gratis. Tu Maestro, una IA, .

Para entender "Mérida" hay que bajar un nivel, a lo que de verdad hay en el disco. Una computadora no guarda letras: guarda bytes, números del 0 al 255. Para guardar texto necesita una tabla que diga qué byte o qué bytes corresponden a cada letra. Esa tabla se llama codificación.

Las dos que vas a encontrar en el trabajo son UTF-8, que puede escribir los caracteres de cualquier idioma, y Windows-1252, una tabla de un byte por letra que usan muchos programas y sistemas viejos en Windows. En Python se llaman "utf-8" y "cp1252". Para las letras sin acento, las dos tablas guardan exactamente los mismos bytes. Con la é, la ñ y la ü, no.

Antes de que te lo explique, predice. En cada programa, len cuenta cuántos elementos tiene algo, y .encode(...) convierte un texto en sus bytes con la tabla que le digas. Escribe qué crees que imprime cada uno y por qué; luego córrelo.

Cuatro programas cortos. Cada uno cambia una sola cosa respecto al anterior.

Cuatro programas cortos. Cada uno cambia una sola cosa respecto al anterior.

Una letra en UTF-8

Ejemplo 1 de 4

example.py
letra = "é"
print(len(letra))
print(letra.encode("utf-8"))
print(len(letra.encode("utf-8")))

Adivinar está bien: se guarda tal como la escribiste para compararla. Solo tú y tu Maestro ven tus predicciones.

Ejemplo 2 de 4, se abre cuando expliques este

Haz tu predicción

Junta lo que viste en una tabla, con lo que imprimió Python:

TextoUTF-8Windows-1252
eb'e', 1 byteb'e', 1 byte
éb'\xc3\xa9', 2 bytesb'\xe9', 1 byte
ñb'\xc3\xb1', 2 bytesb'\xf1', 1 byte
Mérida7 bytes6 bytes

Tres ideas para quedarte:

  1. La codificación es del archivo, no de la letra. La é es la misma letra en los dos casos; lo que cambia es cómo se escribió en bytes. Un archivo no guarda "letras con acento", guarda los bytes que una tabla eligió.
  2. Sin acentos, no se nota. Un archivo con puros nombres como Juan o Tonala se ve igual en las dos tablas. Por eso el problema aparece de pronto, el día que llega el primer Tonalá o Peña.
  3. Leer es aplicar una tabla. Para convertir bytes en letras, el programa tiene que usar la misma tabla con la que se escribieron. El archivo no se lo dice. Si usa otra, salen otras letras: eso es la siguiente página.

Latin-1 (también llamada ISO-8859-1) es casi gemela de Windows-1252: para las letras del español dan los mismos bytes, y difieren en símbolos como el euro. Si un programa te ofrece "Latin-1" para leer un archivo de Windows-1252 con texto en español, normalmente funciona. Si te confunde cuál es cuál, pregúntale a tu Maestro.

Inténtalo

Cambia la palabra del programa por nombres de tu trabajo: tu ciudad, tu apellido, el nombre de un cliente. Busca uno que ocupe los mismos bytes en las dos tablas y otro que no. Prueba también con un emoji y lee qué te dice Python.

Corre el programa. Después cambia palabra por "Tlajomulco de Zúñiga" y vuelve a correrlo: ¿cuántos bytes más ocupa en UTF-8 que en Windows-1252, y por qué? Prueba con una palabra sin acentos y con un emoji. Ya quedó cuando puedas explicar con tus palabras de dónde sale cada difer

Corre el programa. Después cambia palabra por "Tlajomulco de Zúñiga" y vuelve a correrlo: ¿cuántos bytes más ocupa en UTF-8 que en Windows-1252, y por qué? Prueba con una palabra sin acentos y con un emoji. Ya quedó cuando puedas explicar con tus palabras de dónde sale cada diferencia.

Ejecuta tu código para ver lo que imprime y el valor de su última expresión. Cada ejecución empieza de nuevo.

Listo para ejecutar tu código.

Ejecuta tu código para ver su salida aquí.

Ejecútalo tú

Cuando la letra no cabe en la tabla

Hasta aquí las dos tablas sabían todas las letras que probaste. Pero Windows-1252 da un solo byte a cada letra, y un byte solo distingue 256 valores: no hay lugar para todo lo que existe. UTF-8 sí lo tiene, porque usa más bytes cuando hace falta. Prueba con un símbolo que no es una letra del español, una taza de café junto a la palabra:

Python
palabra = "Café ☕"

print(palabra, "tiene", len(palabra), "letras")
print("UTF-8:       ", palabra.encode("utf-8"), len(palabra.encode("utf-8")), "bytes")
try:
    print("Windows-1252:", palabra.encode("cp1252"))
except UnicodeEncodeError as error:
    print("Windows-1252: no cabe,", error.reason)
Salida
Café ☕ tiene 6 letras
UTF-8:        b'Caf\xc3\xa9 \xe2\x98\x95' 9 bytes
Windows-1252: no cabe, character maps to <undefined>
Corrido en la caja de arena de Maestro.Ejecutado el 17 de octubre de 2026 por Maestro sandbox run (check_exercise_code).

UTF-8 escribió la taza en tres bytes, E2 98 95, y Windows-1252 no pudo: Python se detiene con un error en vez de escribir otra cosa en su lugar. Por eso, cuando tú escribes un archivo, UTF-8 es la apuesta segura, y Windows-1252 solo se justifica si el sistema que lo va a leer lo exige. Lo vuelves a ver en el módulo 4. Si tu archivo trae símbolos como el euro o un emoji, pregúntale a tu Maestro qué codificación te conviene.

Comprueba lo que sabes: ¿Cuántos bytes ocupa la palabra "Año" guardada en UTF-8?