2

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

这是在带有 Perl 5.8.8 的 OSX 上。

4

2 回答 2

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 中找到。

于 2010-07-29T16:57:31.660 回答
2

如果你想在事后修复文件,那么你可以通过fix_latin管道它们,这将确保它们都是 UTF-8(假设输入已经是 ASCII、Latin-1、CP1252 或 UTF-8 的某种混合)。

将来,$mech->response->decoded_content无论 Web 服务器使用什么编码,您都可以使用 which 应该为您提供 UTF-8。您binmode(FILE, ':utf8') 在写入之前会确保 Perl 的内部字符串表示在输出时转换为严格的 UTF-8 字节。

于 2010-07-29T21:40:51.847 回答