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

