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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:24:14