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

Systinternals du64.exe为何意外输出带BOM的UTF-16LE编码(Perl解析时发现)

问题与解决方案:Strawberry Perl解析du64.exe输出编码不兼容

问题背景

在全新Windows 11系统中,原在Windows 10+ActiveState Perl环境下正常运行的Strawberry Perl脚本,解析Systinternals du64.exe(磁盘使用率工具)输出时出现异常。排查发现du64.exe输出编码从预期的ASCII变为UTF-16LE(带FFFE字节顺序标记)。

排查代码

use strict;
my $prog = 'du64.exe';  # Sysinternals
my $st = qx( $prog );  # 捕获命令输出
for my $i( 0 .. 6 ) {  # 打印输出前几个字节
    printf "[0x%02X] ", ord( substr( $st, $i, 1 ) );
}
print "...\n";

实际输出

[0xFF] [0xFE] [0x0D] [0x00] [0x0A] [0x00] [0x44] ...

预期输出

[0x0A] [0x44] [0x55] [0x20] [0x76] [0x31] [0x2E] ...

解决方案

方案1:解码UTF-16LE输出

使用Perl的Encode模块将du64.exe的UTF-16LE编码输出转换为Perl内部可处理的文本,修改后的脚本如下:

use strict;
use Encode qw(decode);

my $prog = 'du64.exe';
my $raw_output = qx( $prog );
# 解码带BOM的UTF-16LE输出
my $decoded_output = decode('UTF-16LE', $raw_output);

# 验证解码结果
for my $i( 0 .. 6 ) {
    printf "[0x%02X] ", ord( substr( $decoded_output, $i, 1 ) );
}
print "...\n";

解码后即可得到与原环境一致的文本内容,后续解析逻辑可正常运行。

方案2:调整du64.exe输出编码

执行du64.exe /?查看命令行帮助,若工具支持直接指定输出编码(如UTF-8或ANSI),可通过参数调整输出格式,无需修改脚本。例如部分Sysinternals工具支持-utf8参数,若du64支持,可改为:

my $st = qx( $prog -utf8 );

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:35:32