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

如何使用PowerShell捕获UTF-8编码程序的输出字符串?

解决PowerShell捕获inv.exe输出时的乱码问题

问题现象

直接在控制台调用.\inv.exe getter segments时输出正常:

.\inv.exe getter segments
{28: 'Renda Fixa', 29: 'Renda Variável', ...

但用PowerShell捕获输出或转换为JSON时出现乱码:

$segmentsjson = .\inv.exe getter segments
$segmentsjson
{28: 'Renda Fixa', 29: 'Renda Vari�vel'....

$segmentsjson = .\inv.exe getter segments | ConvertFrom-Json
$segmentsjson
{"28": "Renda Fixa", "29": "Renda Variável"...

已尝试以下方法但无效:

  • chcp 65001
  • $OutputEncoding = [System.Text.Encoding]::UTF8
  • [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
  • $OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding
  • 重定向到文件再读取:
    .\inv.exe getter segments > test.txt
    $segmentsjson = Get-Content "test.txt" -Encoding UTF8
    
  • 通过Out-File保存:
    .\inv.exe getter segments | Out-File -FilePath "output_temp.txt" -Encoding UTF-8
    
  • 用cmd调用并重定向:
    cmd /c inv.exe getter segments > test.txt
    

解决方案

方法1:匹配程序的OEM输出编码

多数原生Windows程序默认使用OEM编码(如Windows-1252,取决于系统区域设置)而非UTF-8输出,PowerShell需匹配该编码才能正确捕获:

# 获取当前系统的OEM编码
$oemEncoding = [System.Text.Encoding]::GetEncoding([int] (Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name OEMCP).OEMCP)
# 设置PowerShell输出编码为OEM编码
$OutputEncoding = $oemEncoding
# 捕获输出
$segmentsjson = .\inv.exe getter segments

方法2:字节流直接解码

若方法1无效,可直接读取程序输出的字节流,再用对应编码解码:

$oemEncoding = [System.Text.Encoding]::GetEncoding([int] (Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name OEMCP).OEMCP)
# 执行程序并获取字节输出
$rawBytes = & .\inv.exe getter segments
# 解码为字符串
$segmentsjson = $oemEncoding.GetString($rawBytes)
# 转换为JSON对象
$jsonObj = $segmentsjson | ConvertFrom-Json

方法3:修正非标准JSON格式后转码

如果程序输出的是类JSON格式(用单引号而非双引号),先转为标准JSON再处理:

$oemEncoding = [System.Text.Encoding]::GetEncoding([int] (Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name OEMCP).OEMCP)
$rawOutput = $oemEncoding.GetString(& .\inv.exe getter segments)
# 替换单引号为双引号,转为标准JSON
$standardJson = $rawOutput -replace "'", '"'
$jsonObj = $standardJson | ConvertFrom-Json

原理说明

原生Windows控制台程序的输出编码通常与系统OEM编码绑定,而PowerShell默认编码不匹配时就会出现乱码。通过强制对齐编码,就能正确解析特殊字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 04:27:17