[Perl]File::Copy复制后文件名乱码

There's more than one way to do it!
https://metacpan.org http://perlmonks.org
回复
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

[Perl]File::Copy复制后文件名乱码

帖子 523066680 »

两个GBK编码(又或者是utf8 utf16)的文件:
中文测试.txt
评分 8.8 blah blah
中文测试.txt
评价 9.9 分
现在假设我要从两个文本中获取分数,然后按分数建立文件夹,并将文本复制到对应分数的文件夹内
中间可能要做一些处理所以导入的时候转为了 Unicode 编码。
use Encode;
use File::Copy;

grep { getRate_and_Copy( $_ ) } (glob "*.txt");

sub getRate_and_Copy
{
my $file = shift;

local $/ = undef;
open READ, "<:encoding(gbk)", $file or die "$!";
$all = <READ>;
close READ;

if ( $all=~/(\d+\.\d)/ )
{
mkdir $1 if ( ! -e $1 ); #1
copy $file, $1;
}
}
复制出来的文件名却是这样的:

代码: 全选

\File-Copy.pl
\中文.txt
\中文测试.txt
\8.8\脰脨脦脛.txt
\9.9\脰脨脦脛虏芒脢脭.txt
代码确有个不严谨的地方(#1):我处理的文件名和路径应该是GBK的,但是却混杂了Unicode情况下提取的
数字字符,8.8 和 9.9,但是,数字以及"." 在Unicode 和 GBK 编码中不是共通的吗?

如果将
open READ, "<:encoding(gbk)", $file or die "$!";
改为
open READ, "<", $file or die "$!";

则无此问题,即使换成 utf8 也是如此。只要解码为 unicode 再提取数字,建立文件夹,复制示例文件进去,就会乱码
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

换一种测试

帖子 523066680 »

其实和 File::Copy 没什么关系,可能和语言实现有关?
use Encode;

my $fold = decode('utf8', "1");
my $subdir = encode('gbk', decode('utf8', "文字"));

mkdir $fold;
mkdir $fold. "/". $subdir;

$fold = encode('gbk', decode('utf8', "2"));
mkdir $fold;
mkdir $fold. "/". $subdir;
代码保存为 UTF8 编码格式。

以 Unicode 字符 "1" (难道不是和 gbk utf8 的 1 一样吗?) 建立目录,然后建立子目录 "文字",结果显示为:
\1\脦脛脳脰

以 gbk 字符 "2" 建立目录,然后建立子目录 "文字",结果显示为:
\2\文字

而如果 "1" (unicode) 不是父目录,而是和 $subdir 连在一起
mkdir decode("utf8", 1) . $substr
将会建立目录 "1文字",并不会乱码。
回复

在线用户

正浏览此版面之用户: 没有注册用户 和 0 访客