Perl范围的字符(Mechanize get/mkdir失败)

Perl范围的字符(Mechanize get/mkdir失败),perl,mechanize,Perl,Mechanize,我目前正在编写一个小的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"); u

我目前正在编写一个小的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的目录为空。当涉及普通字母数字字符时,此方法有效

文件夹标题的示例如下:蜂蜜 霍尼 所以


我只是无法让它创建目录并保存文件。它必须是一个编码问题,但我已经尝试编码到utf8,但这会弄乱原始文本,因为它已经在utf8中编码。解码给了我一个大字符错误。

当您使用Win32::Unicode::Dir时,它不会覆盖LWP::UserAgent等其他软件包中有缺陷的Perl内置
open
等。只需使用
:content\u cb
回调自己写入文件即可


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

如何将网站字符安全地转换为Windows安全字符?你是说我应该解析掉所有外来文本并将其存储在一个文件中,而不是用它创建目录。你能详细说明一下如何解决这个麻烦吗。我现在并不真正关心安全问题。
my $savePath = "C:\\" . $title . "\\Picture_of_honey.jpg";
where $title = "蜂蜜 Honey";