【问题标题】:PHP 7 glob ignores files with accented charactes in namePHP 7 glob 忽略名称中带有重音字符的文件
【发布时间】:2018-03-26 07:36:11
【问题描述】:

我需要处理名称中包含重音字符的文件。不幸的是,看起来 GLOB 忽略了这些文件。我为演示创建了这个短代码:

$files = glob(dirname(__FILE__) .  "/data/tracks/167/*.*");

foreach($files as $file) {
    var_dump($file);
    var_dump(file_exists($file));
}

输出是:

D:\data\zdroje\Kombinovane\MotoQuest\Web\admin\pokus.php:13:string 'D:\data\zdroje\Kombinovane\MotoQuest\Web\admin/data/tracks/167/162_P1030721 (kopie).jpg' (length=87)
D:\data\zdroje\Kombinovane\MotoQuest\Web\admin\pokus.php:14:boolean true
D:\data\zdroje\Kombinovane\MotoQuest\Web\admin\pokus.php:13:string 'D:\data\zdroje\Kombinovane\MotoQuest\Web\admin/data/tracks/167/162_tn_P1030721 (kopie).jpg' (length=90)
D:\data\zdroje\Kombinovane\MotoQuest\Web\admin\pokus.php:14:boolean true
D:\data\zdroje\Kombinovane\MotoQuest\Web\admin\pokus.php:13:string 'D:\data\zdroje\Kombinovane\MotoQuest\Web\admin/data/tracks/167/1_1493222210_P1030721.jpg' (length=88)
D:\data\zdroje\Kombinovane\MotoQuest\Web\admin\pokus.php:14:boolean true
D:\data\zdroje\Kombinovane\MotoQuest\Web\admin\pokus.php:13:string 'D:\data\zdroje\Kombinovane\MotoQuest\Web\admin/data/tracks/167/1_1493222210_tn_P1030721.jpg' (length=91)
D:\data\zdroje\Kombinovane\MotoQuest\Web\admin\pokus.php:14:boolean true

我的目录包含 6 个文件 - 带有重音字符的 2 个被忽略。:

file_exists 也是如此,即使我使用此处列出的提示 - PHP file_exists with accent returns false。

其中一个文件名是:

1_1493385948_tn_22-Ještěd21.jpeg

知道吗,怎么了?

【问题讨论】:

  • 你能把那个文件名复制到描述中吗,我第一次尝试得到相同的行为失败了(我使用了 str twô,这有效)

标签: php file non-ascii-characters


【解决方案1】:

抱歉,没有足够的代表发表评论。 你能告诉我你从中得到了什么吗:

var_dump( iconv_get_encoding() );

然后呢:

$files = scandir( dirname(__FILE__) . "/data/tracks/167/" );
var_dump( $files );

你能用吗:

<?php
$files = array_filter( 
    scandir( dirname(__FILE__) ), function( $file_or_folder ) {
        return !is_dir( dirname(__FILE__) . $file_or_folder );
    }
);
var_dump( $files );
?>

而不是 glob?

【讨论】:

  • 我得到:array (size=3) 'input_encoding' => string 'UTF-8' (length=5) 'output_encoding' => string 'UTF-8' (length=5) ' internal_encoding' => 字符串'UTF-8'(长度=5)
  • 这也是我得到的,所以不是编码问题...请注意,扩展名 JPEG 与 JPG 的重音文件名也不同...顺便说一句,您的代码适用于我系统。
  • 当我使用 . 作为 GLOB 命令时,应该没有区别-。我刚刚将 JPEG 重命名为 JPG,结果是一样的......可能它与操作系统代码页有关 - 我使用的是 Windows 10 64 位代码页 1250。另一方面,它对 PHP 无关紧要。
  • 看起来文件名完全是 CP1250。另一方面,它没有解释为什么 glob 找不到它们。输出是数组 (size=8) 0 => string '.' (长度=1)1 =>字符串'..'(长度=2)2 =>字符串'162_P1030721(kopie).jpg'(长度=24)3 =>字符串'162_tn_P1030721(kopie).jpg'(长度= 27) 4 => 字符串'1_1493222210_P1030721.jpg'(长度=25)5 => 字符串'1_1493222210_tn_P1030721.jpg'(长度=28)6 => 字符串'1_1493385948_22-Jes�te�d21.jpg'(长度=30) 7 => 字符串'1_1493385948_tn_22-Jes�te�d21.jpg'(长度=33)
  • 还有文件,你需要 glob 正则表达式功能吗?
猜你喜欢
  • 2015-07-01
  • 1970-01-01
  • 2012-06-22
  • 2014-08-20
  • 2018-02-12
  • 2021-02-12
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多