我遇到了HTML::Laundry模块问题.以下代码段演示了使用use utf8与否时会发生什么.启用会use utf8导致错误:
Wide character in subroutine entry at /usr/local/share/perl/5.14.2/HTML/Laundry.pm line 329
Run Code Online (Sandbox Code Playgroud)
没有use utf8结果是正确的,但在我的程序的上下文中我需要utf8pragma.
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);
Run Code Online (Sandbox Code Playgroud)
程序文件本身是清晰的UTF-8
file -i cleantest.pl
cleantest.pl: text/plain; charset=utf-8
Run Code Online (Sandbox Code Playgroud)
查看源代码,看起来 HTML::Laundry 正在使用设置的标志来初始化HTML::Parserutf8_mode。此标志导致 HTML::Parser 期望其输入作为未解码的UTF-8 字节流给出,而不是作为 Unicode 字符流给出。
您可能想在 HTML::Laundry 上提交有关此问题的错误报告/功能请求,请求某种方法使其正确处理 Unicode 输入。但与此同时,有一个明显的解决方法:只需将输入编码为 UTF-8,然后再将其传递给 HTML::Laundry:
use Encode qw(encode_utf8);
print $clean->clean(encode_utf8 $snippet);
Run Code Online (Sandbox Code Playgroud)
或者:
utf8::encode($snippet); # encode to UTF-8 in place
print $clean->clean($snippet);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |