从网站上抓取静态html页面并将它们写入单个文件的perl脚本似乎可以正常工作,但也会向控制台打印许多wide character in print at ./script.pl line n
个实例:每个页面都会抓取一个。
然而,简要一瞥所生成的html文件并没有发现任何明显的错误。如何查找/修复问题字符?我是否应该关心修理它?
相关代码:
use WWW::Mechanize;
my $mech = WWW::Mechanize->new;
...
foreach (@urls) {
$mech->get($_);
print FILE $mech->content; #MESSAGE REFERS TO THIS LINE
...
这是在OSX上使用Perl 5.8.8。
答案 0 :(得分:2)
我假设您正在抓取图片或类似的东西,无论如何,您可以通过添加binmode(FILE)
来解决问题;或者如果它们是网页和UTF-8,那么请尝试binmode( FILE, ':utf8' )
。有关详细信息,请参阅perldoc -f binmode
,perldoc perlopentut
和perldoc PerlIO
。
“:bytes”,“:crlf”和“:utf8”以及“:...”形式的任何其他指令都称为I / O层。 “open”pragma可用于建立默认I / O层。见打开。
要将FILEHANDLE标记为UTF-8,请使用“:utf8”或“:encoding(utf8)”。 “:utf8”只是将数据标记为UTF-8而不进一步检查,而“:encoding(utf8)”检查数据是否实际存在 有效的UTF-8。更多细节可以在PerlIO :: encoding。
中找到
答案 1 :(得分:2)
如果你想在事后修好文件,那么你可以通过fix_latin管它们,这将确保它们都是UTF-8(假设输入是ASCII,Latin-1的混合物) ,已经是CP1252或UTF-8。
将来,您可以使用$mech->response->decoded_content
,无论Web服务器使用何种编码,都应该为您提供UTF-8。在写入之前你会binmode(FILE, ':utf8')
,以确保Perl的内部字符串表示在输出时转换为严格的UTF-8字节。