filemtime()函数: 带有umlauts字符的文件名无法进行状态统计

16

我使用PHP函数filemtime来获取PHP 5.3中的最后修改时间。这个函数非常好用,但是当文件名包含特殊字符(例如umlauts)时会出现一些问题。

如果我在一个包含umlauts的文件名上运行它

$stat = filemtime('C:/pictures/München.JPG');

然后我得到输出:

Warning: filemtime() [function.filemtime]: stat failed for C:/pictures/München.JPG

如果我把文件名从"München.JPG"改为"Muenchen.JPG",然后再做同样的事情:

 $stat = filemtime('C:/pictures/Muenchen.JPG');

一切正常!

我的PHP文件以UTF-8无BOM保存,我也尝试过:

clearstatcache();
$stat = filemtime(utf8_encode('C:/pictures/München.JPG'));

但是它并没有起到帮助的作用。


你的文件和操作系统使用相同的字符集吗? - Emil Vikström
2
考虑到这是一个Windows系统,几乎可以确定它使用的是NTFS文件系统,该文件系统采用UTF-16编码。 - Marc B
目前我在一台安装有Windows 7操作系统(使用NTFS格式的硬盘)的机器上使用这个脚本,但是以后我想在Ubuntu服务器上使用它。 - Benny Code
1
尝试使用scandir()函数并报告图片的原始(bin2hex)字符字符串。不过可能你运气不好。https://dev59.com/20bRa4cB1Zd3GeqPzloH - mario
你能影响文件的命名方式吗?在存储之前对文件名进行URLEncoding将是一个简单的方法。例如,您可以保证在每个系统上都拥有一个可用的文件名,并且调用urldecode()能让您轻松地获得完整的字符串。 - Pekka
感谢您的快速回复! scandir() 函数显示的是 "München.JPG",使用 bin2hex 转换后为 "4df66e6368656e2e4a5047"。不幸的是,我不能简单地重命名这些文件,因此它们必须保留原来的名称。 - Benny Code
2个回答

12

通过以下代码片段,我发现在Windows 7上的文件编码为“ISO-8859-1”:

$scandir = scandir('.')
$encoding = mb_detect_encoding($scandir[0], 'ISO-8859-1, UTF-8, ASCII');
echo $encoding;

我读到过 utf8_decode 可以将一个 UTF-8 字符串转换为 ISO-8859-1,所以我写了下面这段小代码来处理我的项目:

$file = 'C:/pictures/München.JPG';
$lastModified = @filemtime($file);
if($lastModified == NULL)
    $lastModified = filemtime(utf8_decode($file));
echo $lastModified;

感谢所有提交评论的人。你们指引了我正确的方向。:-)


1
尝试这个。
$dir    = 'uploads/';

        if (is_dir($dir)) { if ($dh = opendir($dir)) {

            while (($file = readdir($dh)) !== false) {                
                clearstatcache();
                if(is_file($dir."/".$file)) {                    
                    echo $file;
                    echo " - ";                    
                    echo "Last modified: " . date ("F d, Y H:i:s.", filemtime(utf8_decode($dir."/".$file)));
                    echo "<br>";
                }                
            }            

            echo "<br>";
            closedir($dh);
        }
    }

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