使用unicode字符/非UTF重命名文件

时间:2016-08-31 14:53:38

标签: php unicode encoding utf-8 filesystems

好吧,我真的很难与这个人争吵了一段时间。 我有数千个文件,错误的字符被服务器从zip文件中错误地提取出来,产生服务器以这种方式转换的名称:

原始文件名(示例)是

QQ图片20160314173435.jpg

现在在服务器上显示的文件采用

的形式
QQ#U56fe#U724720160314173435.jpg

其中

图 = #U56fe

片= #U7247

所有文件都有相同的2个字符,只有不同的编号..

我尝试过任何我能想到的功能,包括iconv家庭,mb_家庭,str_raplace甚至htmlentities_de/encode等等。

每一个都不会起作用,或者会产生其他奇怪的角色。

我现在的代码是:

// iconv_set_encoding('input_encoding','GB18030');
// print_r($enc);
if ($handle = opendir('./')) {
    while (false !== ($fileName = readdir($handle))) {
        $ext = pathinfo($fileName, PATHINFO_EXTENSION);
        echo $ext .PHP_EOL;
        if ( $ext == 'jpg' ){
            echo "========" . mb_detect_encoding($fileName).PHP_EOL . "\r\n";
            $newName = mb_convert_encoding($fileName, "UTF-8",mb_detect_encoding($fileName));

        // $newName = str_replace("#","\\",$fileName);
        // $newName = str_replace("#U56fe",iconv("UTF-8","GB2312","图"),$newName);
        // $newName = html_entity_decode($newName,ENT_NOQUOTES,"GB2312");

        // $newName = urlencode($newName);
        // $newName = urldecode($newName);
        //
        // Tried //GB2312 // GB18030
        // $newName = iconv(mb_detect_encoding($newName, mb_detect_order(), true), "GB18030", $newName);
        // echo $newName .PHP_EOL;

        // $newName = iconv("UTF-8", "GB18030", $fileName);
        // $newName = iconv("GB18030", "UTF-8", $fileName);
        // $newName = iconv("ISO-8859-9//TRANSLIT", "UTF-8", $fileName);
        // echo $newName .PHP_EOL;
        // $newName = mb_convert_encoding($fileName, 'UTF-8', 'HTML-ENTITIES');


        // tried both  copy and rename+unlink
        //rename($fileName, $newName);
        copy ($fileName,$newName);
        }
    }
    closedir($handle);
}

我留下了一些失败的尝试只是为了展示已经尝试过的东西,但实际上我尝试了更多(包括开头的iconv_set_encoding)。

我在本地(win7 / xampp)和实时服务器(centos / Cpanel)上都尝试过该脚本。

经过这么多次失败后,我甚至不确定这些名称是ASCIIUTF-8还是unicode代表的UTF-8代替。

问题不在于创建新文件或文件夹 - 我可以毫无问题地做到这一点。问题是仅使用PHP重命名现有文件。任何其他重命名方法实际上都有效。

奇怪的是,我在另一台本地计算机上测试了相同的脚本(UBUNTU) - 运行良好 - 当然这表明某些操作系统/ PHP设置是负责任的 - 但是如何?

而且 - 必须有一些方法告诉脚本如何使用代码页/编码并动态更改..

1 个答案:

答案 0 :(得分:-1)

在GNU / Linux系统上,使用sh兼容的shell(如bash),你可以像这样预览重命名:

for f in `find . -type f`; do
  g=`echo "$f" | sed -e 's/#U/\\\\u/g'`
  h=`/usr/bin/printf "$g"`
  if test "$h" != "$f"; then
    echo mv "$f" "$h"
  fi
done

如果您对建议的重命名感到满意,请务必删除上述声明中的“echo”一词:

for f in `find . -type f`; do
  g=`echo "$f" | sed -e 's/#U/\\\\u/g'`
  h=`/usr/bin/printf "$g"`
  if test "$h" != "$f"; then
    mv "$f" "$h"
  fi
done