Windows PowerShell 5.1中WSL命令返回UTF16乱码问题求助
解决Windows PowerShell 5.1中WSL输出UTF-16解码错误的问题
问题根源
WSL命令(如wsl --list --verbose)在Windows PowerShell 5.1环境下输出的是UTF-16LE编码(带BOM),但PowerShell 5.1默认会以系统当前的ANSI/UTF-8编码解析输出,导致每个有效字符之间被插入空字节(\0),最终显示为字符间的多余空格。
可行解决方案
方案1:手动解码字节流(推荐)
直接捕获WSL命令的原始字节输出,手动按UTF-16LE编码解码,从根源避免自动解析出错。修改你的Get-WslDefault函数如下:
function Get-WslDefault { # 捕获WSL命令的原始字节输出,包含标准输出和错误输出 $rawBytes = & wsl --list --verbose 2>&1 # 按UTF-16LE编码解码字节数组 $decodedOutput = [System.Text.Encoding]::Unicode.GetString($rawBytes) # 清理输出:分割行、过滤空行、移除空字节残留 $cleanLines = $decodedOutput -split "`r`n" | Where-Object { $_ -match '\S' } | ForEach-Object { $_ -replace "`0", "" } # 定位默认发行版行(带*标记) $defaultEntry = $cleanLines | Where-Object { $_ -match '^\s*\*' } if ($defaultEntry) { # 分割字段并提取信息 $fields = $defaultEntry -split '\s+' | Where-Object { $_ } [PSCustomObject]@{ Name = $fields[1] State = $fields[2] Version = $fields[3] IsDefault = $true } } else { Write-Warning "未检测到默认WSL发行版" } }
方案2:修复已错误解析的字符串
如果已经得到了带多余空格的$installs变量,可直接移除其中的空字节快速修复:
$fixedInstalls = $installs -replace "`0", ""
为什么调整编码设置无效?
你尝试修改的$OutputEncoding、[Console]::OutputEncoding等设置,主要控制PowerShell向外部程序输出或读取控制台输入的编码,而WSL命令本身的输出编码固定为UTF-16LE,PowerShell 5.1的自动解码逻辑无法正确识别,因此全局编码设置调整无法解决该问题。
内容的提问来源于stack exchange,提问作者user3200739
相关产品推荐
相关产品推荐

