如何找到perl打印的“宽字符”?

时间:2010-07-29 16:44:08

标签: perl unicode screen-scraping www-mechanize

从网站上抓取静态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。

2 个答案:

答案 0 :(得分:2)

我假设您正在抓取图片或类似的东西,无论如何,您可以通过添加binmode(FILE)来解决问题;或者如果它们是网页和UTF-8,那么请尝试binmode( FILE, ':utf8' )。有关详细信息,请参阅perldoc -f binmodeperldoc perlopentutperldoc 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字节。