Perl宽字符(Mechanize get / mkdir失败)

时间:2013-07-20 17:49:55

标签: perl mechanize

我目前正在编写一个小的perl脚本来抓取某些页面,其中有亚洲字符(简体中文和繁体中文)。我面临的第一个问题是,当使用Mechanize时,我从'source'获得的字符串包含宽字符。源页面已经以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目录为空。当涉及正常的字母数字字符时,此方法有效。

文件夹标题的示例是:蜂蜜蜂蜜 所以

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

我无法让它制作目录并保存文件。它必须是一个编码问题,但我已经尝试编码为utf 8,但由于它已经在utf8编码,因此会使原始文本变得混乱。解码给我一个很大的字符错误。

1 个答案:

答案 0 :(得分:0)

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

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