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

There's more than one way to do it!
https://metacpan.org http://perlmonks.org
头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

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

帖子 #1 523066680 » 2017年03月13日 16:33

两个GBK编码(又或者是utf8 utf16)的文件:
中文测试.txt
评分 8.8
blah blah


中文测试.txt
评价 9.9 分


现在假设我要从两个文本中获取分数,然后按分数建立文件夹,并将文本复制到对应分数的文件夹内
中间可能要做一些处理所以导入的时候转为了 Unicode 编码。

Code: [全选] [展开/收缩] [Download] (Untitled.pl)
  1. use Encode;
  2. use File::Copy;
  3.  
  4. grep { getRate_and_Copy( $_ ) } (glob "*.txt");
  5.  
  6. sub getRate_and_Copy
  7. {
  8.     my $file = shift;
  9.  
  10.     local $/ = undef;
  11.     open READ, "<:encoding(gbk)", $file or die "$!";
  12.     $all = <READ>;
  13.     close READ;
  14.  
  15.     if ( $all=~/(\d+\.\d)/ )
  16.     {
  17.         mkdir $1 if ( ! -e $1 );         #1
  18.         copy $file, $1;
  19.     }
  20. }


复制出来的文件名却是这样的:

代码: 全选

\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
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

换一种测试

帖子 #2 523066680 » 2017年03月13日 16:55

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

Code: [全选] [展开/收缩] [Download] (Untitled.pl)
  1. use Encode;
  2.  
  3. my $fold = decode('utf8', "1");
  4. my $subdir = encode('gbk', decode('utf8', "文字"));
  5.  
  6. mkdir $fold;
  7. mkdir $fold. "/". $subdir;
  8.  
  9. $fold = encode('gbk', decode('utf8', "2"));
  10. mkdir $fold;
  11. mkdir $fold. "/". $subdir;


代码保存为 UTF8 编码格式。

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

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

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


回到 “Perl”

在线用户

用户浏览此论坛: 没有注册用户 和 2 访客