0

我目前正在编写一个小的 perl 脚本来抓取某些包含亚洲字符(简体中文和繁体中文)的页面。我面临的第一个问题是,当使用 Mechanize 时,我从“源”获取的字符串包含宽字符。源页面已经以 utf-8 编码。以下是我正在使用的选项和包:

use strict ;
use warnings ;
use utf8;
use Encode qw(decode encode);
use File::Path qw(make_path remove_tree);
binmode(STDOUT, ":utf8");
use Win32::Unicode::Dir;

我可以毫无问题地打印字符串。但是当我尝试创建一个目录时,mkdir 抱怨宽字符或无效参数。从那以后,我尝试了一种使用 mkdirW 的 Win32::Unicode 包的解决方法。该目录现在已成功创建,但在调用时我无法使用该目录:

$mech->get( $url, ':content_file' => $savePath) or die $!;

get 命令成功完成,但 $savepath 的目录为空。当涉及正常的字母数字字符时,此方法有效。

文件夹标题的示例是:蜂蜜 Honey So

my $savePath = "C:\\" . $title . "\\Picture_of_honey.jpg";
where $title = "蜂蜜 Honey";

我只是无法让它创建目录并保存文件。它必须是一个编码问题,但我试图编码为 utf 8,但由于它已经以 utf8 编码,所以原始文本会出现乱码。解码给了我一个宽字符错误。

4

1 回答 1

0

当您使用 Win32::Unicode::Dir 时,它不会覆盖 LWP::UserAgent 等其他包中的错误 Perl 内置open等。只需使用:content_cb回调自己写入文件即可。

让不受您控制的外部网站确定系统上的文件名可能不是一个好主意。这充其量是一个烦恼(许多字符在 Windows 文件系统上是非法的),或者最坏的情况是一个安全漏洞。不要陷入这个陷阱并单独存储文档标题(在数据库/文件中),并为内容文档提供您的代码生成的安全文件名。

于 2013-07-20T18:14:03.547 回答