Skip to content
Empieza gratis

¿Cómo se convierte "Mérida" en "Mérida"?

Sigue los bytes de una palabra de un programa a otro, reconoce los dos tipos de acento roto y repara una columna que ya llegó así.

Curso gratis. Tu Maestro, una IA, .

Ya sabes que "Mérida" guardada en UTF-8 son siete bytes: 4D C3 A9 72 69 64 61. Cinco son letras sin acento y dos, C3 A9, son la é. Ahora sigue esos bytes cuando otro programa abre el archivo.

  1. Alguien escribe Mérida

    en el sistema de pedidos

  2. Se guarda en UTF-8

    4D C3 A9 72 69 64 61

  3. Otro programa abre el archivo

    • Camino 1 de 2: lo lee como UTF-8

      1. Ves Mérida

        C3 A9 se leen juntos: é

      Aquí termina.

    • Camino 2 de 2: lo lee como Windows-1252

      1. Ves Mérida

        C3 se lee à y A9 se lee ©

      Aquí termina.

Los bytes son los mismos en los dos caminos; cambia la tabla con que se leen.

Windows-1252 da un byte a cada letra, así que lee C3 como una letra (Ã) y A9 como otra (©). La é se convierte en dos caracteres, y el primero casi siempre es una Ã. Esto tiene nombre: mojibake, el texto que sale cuando se leen bytes con la tabla equivocada. Así se ven algunas ciudades de los clientes de El Nopal cuando un archivo en UTF-8 se lee como Windows-1252 (lo corrimos en Python):

Se escribióSe lee
QuerétaroQuerétaro
LeónLeón
MazatlánMazatlán
Tlajomulco de ZúñigaTlajomulco de Zúñiga
Miscelánea El GüeroMiscelánea El Güero

El patrón es tan regular que se reconoce de lejos: una à donde iba una letra con acento quiere decir "esto era UTF-8 y alguien lo leyó como Windows-1252".

El camino al revés

Ahora el caso contrario: el sistema viejo de una sucursal guarda en Windows-1252, y lo abre un programa que espera UTF-8. La é es un solo byte, E9, y en UTF-8 ese byte suelto no forma ninguna letra válida. El programa tiene dos salidas: detenerse con un error, o poner en su lugar el signo de reemplazo, �, y seguir. Así queda "M�rida".

Ese rombo con signo de interrogación es peor noticia que la Ã. El programa ya tiró el byte que no entendió, así que desde ese texto no hay forma de saber qué letra era. La reparación es volver al archivo original y leerlo con la codificación correcta. pandas, por ejemplo, elige la primera salida: se detiene. Predice qué pasa:

pandas abre un archivo del sistema viejo

Ejemplo 1 de 2

example.py
import pandas as pd

# Así guarda el archivo el sistema viejo de la sucursal: en Windows-1252.
with open("clientes.csv", "w", encoding="cp1252") as archivo:
    archivo.write("cliente,ciudad\nPapelería La Única,Mérida\nMiscelánea El Güero,León\n")

print(pd.read_csv("clientes.csv"))

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

Ejemplo 2 de 2, se abre cuando expliques este

Haz tu predicción

Cuando el texto ya llegó roto

A veces no tienes el archivo original. Contabilidad abrió el CSV en Excel, vio "Mérida", y lo guardó así; ahora el texto roto es el contenido. Si el síntoma es la Ã, se puede reparar, porque la lectura equivocada no tiró ningún byte: solo los mostró como otras letras. Sigue el razonamiento paso a paso; intenta cada paso antes de abrirlo.

Reparar un nombre que llegó como Miscelánea El Güero

Ejemplo resuelto · 4 pasos

En la columna cliente del reporte de contabilidad aparece "Miscelánea El Güero". No tienes el archivo original. ¿Cómo recuperas el nombre sin reescribirlo a mano?

Piensa el siguiente paso por tu cuenta y luego ábrelo para comparar.

Inténtalo

Ahora la columna completa. Cambia una sola línea para que cada nombre salga reparado. Si no sabes qué línea cambiar, pídele una pista a tu Maestro.

Estos son los clientes del reporte de contabilidad, tal como llegaron. Cambia la línea de reparado para que cada nombre salga bien escrito. Ya quedó cuando se imprimen Papelería La Única, Miscelánea El Güero, Abarrotes Doña Peña y Farmacia San José.

Estos son los clientes del reporte de contabilidad, tal como llegaron. Cambia la línea de reparado para que cada nombre salga bien escrito. Ya quedó cuando se imprimen Papelería La Única, Miscelánea El Güero, Abarrotes Doña Peña y Farmacia San José.

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ú

Error común: Reparar es el último recurso

Si tienes el archivo original, no repares texto: léelo con la codificación correcta (encoding="utf-8" o encoding="cp1252"). Reparar sirve para lo que ya alguien guardó roto, y solo una vez por texto.

Un vistazo para decidir

Los dos síntomas de esta página se reconocen de lejos, y cada uno pide algo distinto:

Lo que vesQué pasóQué haces
à junto a otra letra (é, ó)Un archivo UTF-8 se leyó como Windows-1252Lo lees de nuevo con encoding="utf-8"; si ya está guardado así, lo reparas con encode("cp1252").decode("utf-8")
� donde iba la letraUn archivo en Windows-1252 se leyó como UTF-8 y el programa tiró el byte que no entendióVuelves al archivo y lo lees con encoding="cp1252"
UnicodeDecodeError al leerUn programa que espera UTF-8 se topó con bytes que no lo sonPruebas encoding="cp1252" y compruebas que los nombres se lean bien

Una advertencia honesta: la reparación no siempre se puede. La Í en UTF-8 son los bytes C3 8D, y en la caja de arena "Í".encode("utf-8").decode("cp1252") falla, porque Windows-1252 deja sin definir el byte 8D. Si te topas con un nombre así, la salida es la de siempre: volver al archivo original. Si no sabes en cuál de los tres casos estás, pégale a tu Maestro lo que ves.

Comprueba lo que sabes: En el reporte de una sucursal aparece "Le�n", con un rombo y un signo de interrogación. ¿Qué pasó y qué haces?