将500多个文件名从Unicode U+0600转换为文本

4

由于将文件从一个服务器压缩移动到另一个服务器多次,许多图像的名称被更改为Unicode U+0600 ... 这是阿拉伯语。

这是一个示例

#U062a#U0637#U0628#U064a#U0642#U0627#U062a-#U0645#U062c#U0627#U0646#U064a#U0629-#U0644#U0644#U062a#U0644#U0648#U064a#U0646.jpg

我用这个工具进行转换:http://www.branah.com/unicode-converter,但我必须删除"#"。
问题是有超过500个文件,可能要达到1000个。而且我正在使用WordPress,所有文件都在服务器上。
是否有任何方法可以将它们转换? 可能使用PHP或任何脚本。
更新01: 我发现了这个有用的工具,因为我正在使用CentOs: 它叫convmv。
这里是该工具的链接:https://www.j3e.de/linux/convmv/
它是一个Perl脚本。 以下是其命令列表:https://www.j3e.de/linux/convmv/man/
问题仍然是我不知道从哪里开始和结束。
有没有人对此有任何经验?
更新02:尝试运行Kenosis提供的脚本。
我首先运行了该脚本进行测试。
# perl -wc perl_script.pl
perl_script.pl syntax OK

我运行了没有进行语法检查的脚本:
# perl -w perl_script.pl
Testing: #U0627#U0644#U0623#U064a#U0628#U0627#U062f-Air-150x150.png -> lfybd-Air
-150x150.png
Testing: #U0627#U0644#U0623#U064a#U0628#U0627#U062f-Air-244x300.png -> lfybd-Air
-244x300.png
Testing: #U0627#U0644#U0623#U064a#U0628#U0627#U062f-Air-332x190.png -> lfybd-Air
-332x190.png
Testing: #U0627#U0644#U0623#U064a#U0628#U0627#U062f-Air-518x400.png -> lfybd-Air
-518x400.png
Testing: #U0627#U0644#U0623#U064a#U0628#U0627#U062f-Air.png -> lfybd-Air.png
File 'perl_script.pl' not in convertible format!
Done!

非常感谢您的帮助。谢谢

2个回答

3
也许以下内容会有所帮助:
use strict;
use warnings;
use open qw(:std :utf8);

my $rename = 0;

for my $oldFileName (<*>) {
    my $newFileName = $oldFileName;
    $newFileName =~ s/#U([a-f0-9]+)([^#]+)?/chr( hex $1 ) . ( $2 ? $2 : '' )/gei;

    if ( $newFileName eq $oldFileName ) {
        warn "File '$oldFileName' not in convertible format!\n";
        next;
    }

    if ( -e $newFileName ) {
        warn "File '$newFileName' already exists!\n";
        next;
    }

    print $rename ? 'Renaming: ' : 'Testing: ';
    print "$oldFileName -> $newFileName\n";
    rename $oldFileName, $newFileName if $rename;
}

print "Done!\n\n";

首先在测试或备份目录上运行此脚本

将脚本放置到需要重命名文件的目录中,然后按照以下方式调用:

perl script.pl

该脚本将读取所有文件名。子例程将这些名称转换为Unicode,然后使用模块Text::Unidecode将其解码为ASCII。如果文件名不可转换或已存在,则会进行提示(为了安全起见)

默认情况下,$rename设置为零(false),因此您可以进行非侵入式运行以查看重命名结果。将$rename设置为1或非零值以进行实际重命名。

希望这有所帮助!


1
@BilalKhoukhi - 看起来这里有它的一个rpm版本[http://rpmfind.net//linux/RPM/mandriva/devel/cooker/sparcv9/media/contrib/release/perl-Text-Unidecode-0.40.0-2.noarch.html],但你也可以在命令行中执行以下操作:`sudo cpan install Text::Unidecode`,然后就可以了。 - Kenosis
1
@BilalKhoukhi- 抱歉,我可能误解了。 你只需要将它转换成阿拉伯语? - Kenosis
1
@BilalKhoukhi - 例如:#U062a#U0637#U0628#U064a#U0642#U0627#U062a-#U0645#U062c#U0627#U0646#U064a#U0629-#U0644#U0644#U062a#U0644#U0648#U064a#U0646.jpg -> تطبيقات-مجانية-للتلوين.jpg - Kenosis
1
@BilalKhoukhi - 更新了脚本。示例:#U0627#U0644#U0623#U064a#U0628#U0627#U062f-Air-150x150.png -> الأيباد-Air-150x150.png Text::Unidecode 最终不需要了... - Kenosis
1
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/43716/discussion-between-kenosis-and-bilal-khoukhi - Kenosis
显示剩余9条评论

1

参考这个答案。使用这个简单的函数:

<?php
    function uni2arabic($uni_str) 
    {   
          for($i=0; $i<strlen($uni_str); $i+=4)
             {
                    $new="&#x".substr($uni_str,$i,4).";"; 
                    $txt = html_entity_decode("$new", ENT_COMPAT, "UTF-8");
                    $All.=$txt;
             }

        return $All;
    }
?>

您可以使用foreach循环遍历所有文件,它会为您将Unicode转换为阿拉伯文本。

这是一个自动化脚本吗? 我的意思是,我想要一个只需要展示文件,就可以转换字符的工具。 我不想手动操作,因为文件数量很大。我只想更改文件名,仅此而已。 - Bilal Khoukhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接