Exportas una tabla. Abres el CSV. En lugar de "José" ves "José". En lugar de "€" ves "€". En lugar de un guión largo ves "â€"".
Bienvenido al infierno del encoding.
Esta guía explica por qué pasa y cómo solucionarlo—ya sea que estés exportando manualmente o construyendo herramientas de extracción.
Qué Está Pasando Realmente
La codificación de caracteres es cómo las computadoras representan texto como bytes. Diferentes codificaciones usan diferentes patrones de bytes para el mismo carácter.
El culpable más común: UTF-8 interpretado como Latin-1 (o viceversa).
UTF-8 usa múltiples bytes para caracteres no ASCII. Cuando un software lee esos bytes como Latin-1 (codificación de un solo byte), cada byte se convierte en un carácter incorrecto separado.
| Carácter | Bytes UTF-8 | Mal leído como Latin-1 |
|---|---|---|
| é | C3 A9 | é |
| € | E2 82 AC | € |
| — | E2 80 94 | â€" |
| ñ | C3 B1 | ñ |
El patrón es consistente: secuencias multi-byte se convierten en múltiples caracteres incorrectos.
Dónde Se Rompe el Encoding
1. La Página Fuente
El sitio web puede declarar una codificación pero servir otra. O no declarar nada, dejando que los navegadores adivinen.
<!-- Declara UTF-8 -->
<meta charset="UTF-8">
<!-- Pero el servidor envía -->
Content-Type: text/html; charset=ISO-8859-1
Cuando las declaraciones entran en conflicto, los navegadores generalmente lo resuelven. Las herramientas de exportación tal vez no.
2. El Proceso de Exportación
Si tu herramienta de extracción no preserva el encoding, los bytes se reinterpretan.
El textContent de JavaScript devuelve cadenas Unicode, lo cual es seguro. Pero convertir a un archivo requiere elegir una codificación. Si esa elección es incorrecta, ocurre la corrupción.
3. La Aplicación que Abre el Archivo
Exportas un CSV UTF-8 válido. Excel lo abre como Latin-1 porque adivina mal. Misma corrupción, causa diferente.
Por eso el mismo archivo se ve bien en una aplicación y roto en otra.
Cómo Diagnosticar el Problema
Reconocimiento de Patrones
Ciertas corrupciones son diagnósticas:
| Ves esto | Lo original era |
|---|---|
| á, é, Ã, ó, ú | á, é, í, ó, ú (acentos del español) |
| ä, ö, ü | ä, ö, ü (diéresis del alemán) |
| ç | ç (cedilla) |
| € | € (signo del Euro) |
| â€" | — (guión largo) |
| ’ | ' (apóstrofe curvo) |
Si ves à seguido de otro carácter, UTF-8 fue leído como Latin-1.
Verificar los Bytes Crudos
En Python:
with open('archivo.csv', 'rb') as f:
print(f.read(100))
Si ves \xc3\xa9 donde esperas "é", el archivo es UTF-8. Si ves \xe9, es Latin-1.
Verificar lo que Declara la Página
En las herramientas de desarrollo del navegador:
document.characterSet // Devuelve la codificación real usada
Arreglando Archivos Corruptos
El Truco de Re-codificar
Si UTF-8 fue mal leído como Latin-1, puedes revertirlo:
# Leer como Latin-1 (como fue interpretado incorrectamente)
with open('corrupto.csv', 'r', encoding='latin-1') as f:
text = f.read()
# Codificar de vuelta a bytes Latin-1, luego decodificar como UTF-8
fixed = text.encode('latin-1').decode('utf-8')
with open('arreglado.csv', 'w', encoding='utf-8') as f:
f.write(fixed)
Esto solo funciona si la corrupción fue una simple mala interpretación. Doble corrupción o codificaciones mixtas son más difíciles.
Forzar a Excel a Leer UTF-8
Excel frecuentemente ignora UTF-8. Dos soluciones:
Opción 1: Agregar BOM
Un Byte Order Mark al inicio del archivo señala UTF-8:
with open('archivo.csv', 'w', encoding='utf-8-sig') as f:
f.write(data)
Opción 2: Asistente de Importación
En lugar de hacer doble clic en el CSV, usa Datos → Obtener datos → De texto/CSV y especifica la codificación UTF-8 manualmente.
Google Sheets como Intermediario
Google Sheets maneja el encoding mejor que Excel. Importá el CSV ahí, luego exportá a XLSX. El archivo de Excel preservará los caracteres correctamente.
Previniendo Problemas de Encoding
Si Estás Exportando Manualmente
Usa herramientas que manejen el encoding correctamente. HTML Table Exporter preserva Unicode a lo largo de todo el proceso de exportación, evitando los errores de conversión que causan mojibake.
Para exportaciones CSV, si tu herramienta ofrece opciones de encoding, elige UTF-8 con BOM para compatibilidad con Excel.
Si Estás Construyendo Herramientas de Extracción
Siempre ser explícito con el encoding:
# Escribiendo CSV
with open('salida.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerows(data)
# Leyendo HTML
response = requests.get(url)
response.encoding = response.apparent_encoding # Auto-detectar
html = response.text
Para JavaScript/extensiones de navegador:
// Blob con encoding explícito
const blob = new Blob(['\ufeff' + csvContent], {
type: 'text/csv;charset=utf-8;'
});
El \ufeff es el BOM que ayuda a Excel.
Si Estás Usando Pandas
# Lectura
df = pd.read_csv('archivo.csv', encoding='utf-8')
# Escritura con BOM para Excel
df.to_csv('salida.csv', encoding='utf-8-sig', index=False)
Caracteres Especiales que Causan Problemas
Comillas Tipográficas y Apóstrofes
Los procesadores de texto convierten comillas rectas en curvas:
- ' → ' (U+2019)
- " → " " (U+201C, U+201D)
Estos son multi-byte en UTF-8 y se rompen en Latin-1.
Guiones Largos y Cortos
- — (guión largo, U+2014)
- – (guión corto, U+2013)
Comunes en datos financieros y publicaciones.
Espacios de No Separación
El espacio regular es 0x20. El espacio de no separación es 0xA0 (Latin-1) o 0xC2 0xA0 (UTF-8).
Son invisibles pero rompen comparaciones de cadenas y parsing.
# Normalizar espacios
text = text.replace('\xa0', ' ')
Símbolos de Moneda
€, £, ¥ están todos fuera de ASCII y se codifican diferente en UTF-8 vs Latin-1.
Referencia Rápida
| Problema | Causa Probable | Solución |
|---|---|---|
| Ã seguido de carácter | UTF-8 leído como Latin-1 | Re-codificar o especificar UTF-8 al importar |
| ? o □ reemplazando caracteres | La codificación no soporta el carácter | Usar UTF-8 en todo el flujo |
| Excel muestra basura | Excel adivinó mal la codificación | Usar UTF-8 BOM o asistente de importación |
| Caracteres invisibles rompiendo datos | Espacios de no separación o caracteres de ancho cero | Normalizar espacios en blanco |
La Regla Fundamental
Hacer coincidir el encoding en cada paso. Exportar como UTF-8. Abrir como UTF-8. Guardar como UTF-8.
En el momento en que un paso usa una codificación diferente, los caracteres se corrompen.
Ante la duda, UTF-8 con BOM es la opción más segura para archivos que van a tocar Excel.
¿Quieres exportaciones que manejen el encoding correctamente? Más información en gauchogrid.com/es/html-table-exporter o prueba HTML Table Exporter gratis en la Chrome Web Store.
Para más información sobre cómo exportar tablas web limpiamente, mira nuestra guía sobre cómo exportar todas las filas de una tabla web paginada.
Top comments (0)