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
相关产品推荐
相关产品推荐

