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

3
一个perl脚本从网站抓取静态html页面并将它们写入单独的文件,看起来工作正常,但是也会在控制台上打印出许多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个回答

2
我假设您正在爬取图像或类似的内容,无论如何,您可以通过添加 binmode(FILE); 或者如果它们是网页并且使用UTF-8,则尝试 binmode( FILE, ':utf8' ) 来解决问题。有关更多信息,请参见 perldoc -f binmodeperldoc perlopentutperldoc PerlIO
":bytes"、":crlf"、":utf8"以及任何其他形式为":..."的指令都称为I/O层。 "open" 声明可以用于建立默认的I/O层。请参见 open。
要将FILEHANDLE标记为UTF-8,请使用":utf8"或":encoding(utf8)"。 ":utf8"只是将数据标记为UTF-8而不进行进一步检查,而":encoding(utf8)"会检查数据是否实际上是有效的UTF-8。有关更多详细信息,请参阅PerlIO::encoding。

我正在处理纯HTML。我能做些什么来检查我已经拥有的文件,或者我的唯一选择是在“open FILE etc”之后插入“binmode(FILE,“:utf8'”)”,从头开始重新开始吗? - Larry Wang
这不是你唯一的选择,你可以使用 open ( my $fh, '>:utf8', ... ) 在一个命令中完成。有很多问题可能会导致这种情况发生,请阅读这篇博客文章了解详细信息。 - Evan Carroll
1
谢谢提供链接,但那篇文章只是讲如何预防这个问题,而不是如何评估它的严重程度以及在发生后如何修复它,这才是我问题的重点。 - Larry Wang

2
如果您想在事后修复文件,则可以通过fix_latin对其进行处理,以确保它们全部是UTF-8编码(假设输入已经是ASCII、Latin-1、CP1252或UTF-8的混合编码)。
对于未来,您可以使用$mech->response->decoded_content,这应该会给您UTF-8编码,无论Web服务器使用什么编码。然后,在写入之前,您应该binmode(FILE, ':utf8'),以确保Perl的内部字符串表示在输出时转换为严格的UTF-8字节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接