Board logo

标题: [原创代码] Perl批量替换含有utf8代码(比如%5B%5D)的文件名 [打印本页]

作者: 523066680    时间: 2014-8-10 22:47     标题: Perl批量替换含有utf8代码(比如%5B%5D)的文件名

这标题真不好起。
有时候网上下的文件一堆%符号,部分字符被转为UTF8代码的形式,而非明文的形式。
这里写一个批量转换的工具自己用。试了一下没有大BUG,就发上来了。
  1. use utf8;
  2. use Encode;
  3. use IO::Handle;
  4. use URI::Escape;
  5. STDOUT->autoflush(1);
  6. my $name;
  7. foreach (glob "*") {
  8.     if (
  9.         (-f $_) and  ($_ =~ /%[0-9a-fA-F]{2}/)
  10.     ) {
  11.         $name = &utfcode_to_char($_);
  12.         print $_,"\n";
  13.         print " => ", $name, "\n\n";
  14.         rename($_, $name) or warn "$!";
  15.     }
  16. }
  17. <STDIN>;
  18. sub utfcode_to_char {
  19.     #传参示例: %e4%b8%adtest[]
  20.     #逐个处理,转换为明文后代入
  21.     my $src = shift;
  22.     my $n=0;
  23.     my $ustr;
  24.     while ($src=~/((%[0-9a-fA-F]{2})+)/) {
  25.         $ustr = decode('utf8', uri_unescape($1));
  26.         $ustr = encode('gbk', $ustr);
  27.         #代入的时候使用GBK
  28.         $src =~s/$1/$ustr/;
  29.     }
  30.     print "未找到需要替换的字串" if (not defined $ustr);
  31.     return $src;
  32. }
复制代码
示例文件列表:
──────────────────────────────────┐
%5B利伯蒂的远征%5D.%28美%29杰夫·格拉布.文字版.pdf                  │
%5B彩虹六号:维加斯%5D.Tom_Clancys_Rainbow_Six_Vegas-HATRED-ENG.nfo │
Clipboard WaitForChange.pl                                          │
[文件改名]%UTF8代码转字符V1.0.pl                                    │
[文件改名][批量]%UTF8代码转字符V1.0.pl                              │
──────────────────────────────────┘


执行结果:
──────────────────────────────────┐
%5B彩虹六号:维加斯%5D.Tom_Clancys_Rainbow_Six_Vegas-HATRED-ENG.nfo │
  => [彩虹六号:维加斯].Tom_Clancys_Rainbow_Six_Vegas-HATRED-ENG.nfo│
                                                                    │
%5B利伯蒂的远征%5D.%28美%29杰夫·格拉布.文字版.pdf                  │
  => [利伯蒂的远征].(美)杰夫·格拉布.文字版.pdf                     │
──────────────────────────────────┘

作者: 523066680    时间: 2014-8-10 23:16

补充:
这本来呢 uri_unescape($str);  可以直接转换,即使是穿插有其他字符的也不会出错。
比如 %5bTEST%5d,能够转换为 [TEST] 。 但是不排除有 "测试%e4%b8%ad" 这
种考验严谨程度的UTF8和GBK共存情况,所以还是做了截断,逐个处理……
作者: CrLf    时间: 2014-8-10 23:36

有将 utf-8 乱码文件名转为正常文件名的现成 perl 吗?
convmv 没找到源码,不然就简单了
作者: 523066680    时间: 2014-8-11 00:16

回复 3# CrLf


    什么情况?举个栗子。
作者: 523066680    时间: 2014-8-11 00:36

本帖最后由 523066680 于 2014-8-11 00:40 编辑

回复 3# CrLf


    你是说utf-8编码流的汉字作为文件名的时候,系统按GBK编码解读,然后看起来乱码的问题是不?
(以下脚本保存为GBK编码文件)
  1. use Encode;
  2. $str="./甯哥敤ARM鎸囦护闆嗗強姹囩紪.pdf";
  3. print encode('gbk', decode('utf8', $str));
  4. <STDIN>;
复制代码
输出结果:
./常用ARM指令集及汇编.pdf

上面的文件名是从这里参考的 http://blog.163.com/yaning_softw ... 721201171114221611/
他页面上粘贴的某些文件字符成了?,有丢失。 其他情况就不太清楚了
作者: CrLf    时间: 2014-8-11 00:54

回复 5# 523066680


    卧槽,可以这么短...
    谢谢,我改来用~




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2