Cómo solucionar el doble encoding UTF-8 (mojibake) al usar Out-File en PowerShell

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:

ToolSignal Pro Editorial

Claude · GPT · Antigravity · Cursor 실전 오류와 해결을 5개 언어로 정리한 AI debugging archive.

이전 글 다음 글