You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell Invoke-RestMethod调用API时输出编码异常问题

问题根因
  • 你当前使用的是Windows PowerShell 5.x版本,该版本的Invoke-RestMethod、Invoke-WebRequest存在历史遗留设计缺陷:解析响应内容时默认硬编码使用ISO-8859-1编码,既不会自动识别接口响应头中声明的charset配置,也没有公开参数允许手动指定响应内容的解码编码。
  • 你配置的$PSDefaultParameterValues['*:Encoding'] = 'utf8'无法覆盖上述解码逻辑,该默认参数配置仅对公开了Encoding参数的cmdlet生效,web请求的响应解码属于cmdlet内部硬编码逻辑,不受这个配置影响。
  • 你传入的-ContentType "text/*; charset=utf8"参数对响应解码没有任何作用:这个参数是发送给服务端的声明,用来标注请求方发送的请求体的格式和编码,GET请求没有请求体时该参数基本不生效,更不可能控制客户端对返回内容的解析规则。
  • 如果控制台本身的输出编码未配置为UTF8,即使内容解码正确,打印到控制台的渲染阶段也可能出现乱码。
修复方案

方案1:不升级PowerShell的兼容写法

跳过Invoke-RestMethod的自动解析逻辑,先获取原始响应字节流,手动按UTF8解码后再转换为对象,代码如下:

# 先配置控制台输出编码为UTF8,避免显示阶段乱码
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$PSDefaultParameterValues['*:Encoding'] = 'utf8'

$Header = @{"Authorization" = "Token token_value"}
$uri = "https://some_api_url"

# 拉取原始响应,跳过内置自动解码逻辑
$rawResp = Invoke-WebRequest -Method GET -Uri $uri -Headers $Header -UseBasicParsing
# 手动指定UTF8编码解码响应字节流
$decodedContent = [System.Text.Encoding]::UTF8.GetString($rawResp.RawContentStream.ToArray())
# 若接口返回JSON格式,手动转换为PowerShell对象
$team = $decodedContent | ConvertFrom-Json
$team.last_name

方案2:升级PowerShell彻底解决问题

直接升级到PowerShell 7及以上版本(原PowerShell Core),该跨平台版本已经修复了Windows PowerShell 5.x中web请求的编码缺陷:

  • 默认优先使用UTF8编码解析响应
  • 会自动识别响应头中的charset声明调整解码规则
  • 原生支持通过参数指定响应编码,不会再出现硬编码导致的乱码问题

如果你的接口返回的不是JSON格式,把上述代码中的ConvertFrom-Json替换为对应格式的转换命令即可。

内容的提问来源于stack exchange,提问作者elpe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 00:18:20