DEV Community

Cover image for Por Qué Tu Tabla Exportada Tiene Caracteres Raros (Y Cómo Solucionarlo)
circobit
circobit

Posted on

Por Qué Tu Tabla Exportada Tiene Caracteres Raros (Y Cómo Solucionarlo)

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
Enter fullscreen mode Exit fullscreen mode

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))
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Para JavaScript/extensiones de navegador:

// Blob con encoding explícito
const blob = new Blob(['\ufeff' + csvContent], { 
  type: 'text/csv;charset=utf-8;' 
});
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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', ' ')
Enter fullscreen mode Exit fullscreen mode

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)