3 min read · 621 words
Si alguna vez has sufrido intentando guardar datos de una API en un archivo usando PowerShell y te has topado con que los caracteres especiales (en mi caso, coreano) se rompen por culpa de un doble encoding UTF-8, este post es para ti. Te comparto mi tarde de sufrimiento en producción y cómo lo solucioné de raíz usando Python.
La pesadilla
Según mi registro de operaciones, todo empezó cuando mi jefe me pidió respaldar el contenido de unos posts en coreano desde la API de Blogger. En este mundo capitalista, la orden de un superior es ley absoluta, así que armé rápidamente un script en PowerShell para hacer la petición. El drama empezó cuando recibí la respuesta de la API y la pasé por Out-File -Encoding utf8 para guardarla en un archivo. En ese instante, PowerShell interpretó los 3 bytes de UTF-8 como Latin-1 y los volvió a codificar en 6 bytes, provocando un desastre de doble encoding (Double UTF-8). Sudé frío cuando abrí el archivo de respaldo para mostrárselo a mi jefe y solo vimos basura ilegible.
Síntomas del error
Al recargar el JSON guardado, los caracteres coreanos eran puro "mojibake" (caracteres rotos). Intenté buscar la palabra "사장님" (jefe) dentro del archivo y obtuve cero resultados; el grep falló por completo. El archivo estaba inundado de jeroglíficos extraños como íë§.
Entorno
- S.O.: Windows 11
- Shell: PowerShell 5.1
- Runtime: Python 3.12 / requests 2.31
Lo que intenté (y falló)
- Especificar -Encoding utf8: Aunque forcé explícitamente la codificación en el comando de PowerShell, seguía metiendo el UTF-8 BOM a la fuerza o duplicando el encoding. Un desastre total.
- Intentar decodificar con utf-8-sig en Python: Intenté leer el archivo generado por Out-File desde Python cambiando el encoding de lectura. Parecía que se solucionaba el encoding base, pero el texto seguía roto (mojibake) e irrecuperable.
La solución definitiva
Aunque la causa raíz exacta requiere más análisis, el culpable parece ser el pipeline de PowerShell 5.1. Al procesar strings de .NET para la salida, intenta re-codificarlos basándose en la configuración regional del sistema, confundiendo UTF-8 con Latin-1 y duplicando el encoding. Al final, decidí mandar a volar el sistema de salida de archivos de PowerShell. Modifiqué el flujo para hacer la petición directamente con la librería requests de Python y escribir el archivo usando el open nativo y json.dump.
Código utilizado
import requests, json
url = "YOUR_BLOGGER_API_URL"
out_path = "backup.json"
# Petición directa y guardado de archivo en Python
r = requests.get(url)
with open(out_path, "w", encoding="utf-8") as f:
json.dump(r.json(), f, ensure_ascii=False)Verificación
Volví a descargar los datos con Python y revisé el JSON. Palabras en coreano como '소프트웨어' (software) e '인사이트' (insight) se leían perfectamente y sin fallos. Al cargar el JSON, se procesó limpio con un único encoding UTF-8.
Estado actual
fixed (Solucionado)
Consejo para navegantes
Si estás en Windows con PowerShell 5.1 y necesitas guardar respuestas de APIs con caracteres especiales, no pierdas el tiempo peleándote con la codificación de la consola. Por las limitaciones del pipeline de PowerShell, lo más probable es que solo quemes horas de trabajo. Ve a lo seguro y escribe el archivo directamente desde un entorno como Python o Node.js usando encoding='utf-8'. Es la vía rápida y definitiva.
Category Coverage Notice
This article follows our label-specific editorial criteria. Details: