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

Perl中Mojo::DOM处理UTF8等编码时出现编码损坏问题

Mojo::DOM 编码适配问题记录

问题现象

尝试梳理Mojo::DOM对UTF-8及其他编码格式的正确使用方式时,发现模块处理流程会破坏文本原有编码,初始实现代码如下:

my $dom = Mojo::DOM->new($html);

$dom->find('script')->reverse->each(sub {
    #print "$_->{id}\n";
    $_->remove;
});

$dom->find('style')->reverse->each(sub {
    #print "$_->{id}\n";
    $_->remove;
});

$dom->find('script')->reverse->each(sub {
    #print "$_->{id}\n";
    $_->remove;
});

my $html = "$dom"; # 回传给$html,此时已完成HTML清理

实际运行表现:

  • 未经过Mojo::DOM处理直接保存的文件内容显示完全正常
  • 经过上述逻辑处理后输出的文件内容出现乱码

初始实现细节

文件读取通过Path::Tiny模块实现,使用的读取代码为:
my $utf8 = path($_[0])->slurp_raw;
最初认为slurp_raw方法读取到的原始字节数据可以直接传入Mojo::DOM处理。

临时解决方案

在收到相关建议后,调研了可自动识别文件编码的解码方案,先后测试了Encode::Guess等多个Perl生态下的编码识别模块,但这类模块在不少场景下存在编码识别不准的问题,目前实测如下方案可正常解决乱码问题:

my $enc_tmp = `encguess $_[0]`;
my ($fname,$type) = split /\s+/, $enc_tmp;
my $decoded = decode( $type||"UTF-8", path($_[0])->slurp_raw );

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:34:13