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

