我遇到了HTML::Laundry
模块的问题。以下代码段演示了使用use utf8
时是否会发生的情况。启用use utf8
会导致错误:
Wide character in subroutine entry at /usr/local/share/perl/5.14.2/HTML/Laundry.pm line 329
如果没有use utf8
,结果是正确的,但在我的程序环境中,我需要utf8
编译指示。
use utf8;
use HTML::Laundry;
use strict;
my $snippet = "<p style=\"line-height: 18px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(153, 153, 153); margin: 0px; padding: 0px;\"><br>Sämtliche Produkte von collec entstehen in Zusammenarbeit mit Schweizer Werkstätten. collec setzt sich dafür ein, dass auch Menschen, die an geschützten Arbeitsplätzen tätig sind, hochwertige Produkte herstellen können. collec macht sich stark für die Erhaltung von Handarbeit und Handwerk, denn „Handwerk berührt das Denken.“</p>";
my $clean = HTML::Laundry->new();
$clean->remove_acceptable_element(['font','span']);
$clean->remove_acceptable_attribute(['class','style']);
print $clean->clean($snippet);
程序文件本身是清晰的UTF-8
file -i cleantest.pl
cleantest.pl: text/plain; charset=utf-8
答案 0 :(得分:4)
在source偷看,看起来HTML :: Laundry正在初始化HTML::Parser并设置了utf8_mode
标志。此标志使HTML :: Parser期望其输入作为未解码的 UTF-8字节流而不是Unicode字符流提供。
您可能希望在HTML :: Laundry上提交有关此问题的错误报告/功能请求,并要求某种方法使其正确处理Unicode输入。同时,还有一个明显的解决方法:只需将输入编码为UTF-8,然后再将其传递给HTML :: Laundry:
use Encode qw(encode_utf8);
print $clean->clean(encode_utf8 $snippet);
或:
utf8::encode($snippet); # encode to UTF-8 in place
print $clean->clean($snippet);