使用带有HTML :: Laundry的utf8 pragma的宽字符错误

时间:2014-08-06 08:35:52

标签: perl perl-module

我遇到了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

1 个答案:

答案 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);