PHP文件重命名 - 文件名中的非法字符

时间:2017-10-17 09:25:00

标签: php character-encoding

我想使用PHP重命名文件。

我遍历包含文件的目录,一旦找到该文件,我想使用rename()进行实际的重命名。

到目前为止这么简单。

问题是需要重命名的文件在文件名中包含非法字符。 我可以从名称中删除非法字符,但是当我想使用新名称重命名文件时,无法找到它。

所以一旦我到达可以使用rename()的地步,PHP就会发出警告:系统无法找到指定的文件。 (代码:2)。

PHP似乎无法将文件识别为文件(is_file()返回false)。 有问题的文件是一个pdf文件,我可以在Acrobat Reader中没有任何问题地打开它。 该文件是使用Quartz在Mac上生成的,我正在使用Windows。

有没有人知道如何让PHP识别名称中的非法字符作为文件的文件?

PS

这是我的代码:

$dataDirectory = new RecursiveDirectoryIterator($folders);

foreach ($dataDirectory as $dataName => $dataFileName) {

   $isfile = is_file($dataFileName); // false for files with illegal character in filename
   $result = rename($dataFileName, 'testname'); // generates warning mentioned above 

}

1 个答案:

答案 0 :(得分:0)

服务器操作系统是什么?

如果是Windows,您将无法以UTF-8编码的文件名访问文件,因为PHP使用的C IO库的Windows实现只会在系统默认情况下进行通信代码页。对于西欧安装,即代码页1252.您可以使用iconv将UTF-8字符串转换为cp1252:

$winfilename= iconv('utf-8', 'cp1252', $utffilename);

(也可以使用utf8_decode,但是对于Windows映射到cp1252中0x80-0x9F范围的扩展字符会产生错误的结果。)

使用stdio的PHP和其他程序根本无法访问其名称包含系统代码页的所有字符之外的字符的文件(例如,西方框中的希腊语)。有些脚本语言可以通过Win32 API使用原生Unicode文件名,但PHP5不是其中之一。

当然,在文件系统采用UTF-8编码的不同操作系统上部署时,不应使用上述步骤。 (即现代Linux。)

如果您需要与PHP无缝地跨服务器兼容,那么您必须避免在文件名中使用非ASCII字符。遗憾。