解决 PowerShell Out-File 韩文乱码与双重 UTF-8 编码问题

1 min read · 243 words

如果你在 PowerShell 中把 API 数据保存为文件时,也遇到了因双重 UTF-8 编码(Double UTF-8)导致的韩文乱码问题,看这篇就够了。本文分享我最近在生产环境踩的坑,以及如何用 Python 彻底绕过这个大坑。

问题背景

事情是这样的:老板突然下达指示,要求把 Blogger API 爬取到的韩文文章内容备份成 JSON 文件。在资本主义社会,老板的备份指令就是绝对命令,必须火速执行。我立马写了个 PowerShell 脚本去调接口。然而,当 API 响应数据经过 Out-File -Encoding utf8 落地成文件后,惨剧发生了:原本 3 字节的韩文字符被错误地识别成了 Latin-1,进而被二次编码成了 6 字节(即 Double UTF-8)。在准备给老板演示备份成果时,看着满屏幕的乱码,我当场捏了一把冷汗。

故障现象

重新加载保存的 JSON 文件时,韩文部分全部变成了乱码(mojibake)。在文件里搜索“사장님”(老板)等关键字,匹配结果为 0,用 grep 过滤也完全失效。文件里塞满了类似 íë§ 这种根本看不懂的火星文。

运行环境

  • OS: Windows 11
  • Shell: PowerShell 5.1
  • Runtime: Python 3.12 / requests 2.31

尝试过但失败的方案

  • 显式指定 -Encoding utf8: 即使在 PowerShell 命令中明确指定了编码,依然会强制带上 UTF-8 BOM,或者双重编码问题依旧,直接宣告失败。
  • 在 Python 中尝试用 utf-8-sig 解码: 保持 Out-File 输出的文件不变,尝试在 Python 读取时调整解码方式。虽然编码看似解开了,但文本内容依然是乱码(mojibake),无法恢复。

最终解决

虽然深层原因有待进一步考证,但目前可以确认的是:PowerShell 5.1 的管道处理机制在输出 .NET 字符串时,会根据系统区域设置(Locale)进行二次编码。这导致它把 UTF-8 数据误判为 Latin-1,从而触发了双重编码。既然如此,我决定彻底绕过 PowerShell 的文件输出功能。直接改用 Python 的 requests 库调用 API,并利用 Python 内置的 open 函数和 json.dump 直接写入文件,问题迎刃而解。

解决方案代码

import requests, json

url = 'YOUR_BLOGGER_API_URL'
out_path = 'backup.json'

# 直接用 Python 请求 API 并保存文件
r = requests.get(url)
with open(out_path, 'w', encoding='utf-8') as f:
 json.dump(r.json(), f, ensure_ascii=False)

验证结果

用 Python 重新拉取并保存后,检查 JSON 文件。内容中的“소프트웨어”(软件)、“인사이트”(洞察)等韩文词汇全部显示正常,无任何乱码。JSON load 时也能以单层 UTF-8 干净利落地读取。

当前状态

fixed(已解决)

给遇到同类问题兄弟的建议

在 Windows PowerShell 5.1 环境下保存 API 响应时,如果遇到乱码,千万别浪费时间去折腾 Shell 的编码设置。由于管道编码的底层限制,折腾这些大概率是白费功夫。最快、最稳妥的办法就是直接起个 Python 或 Node.js 脚本,在代码里指定 encoding='utf-8' 落地文件。

Category Coverage Notice

This article follows our label-specific editorial criteria. Details:

ToolSignal Pro Editorial

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

이전 글 다음 글