我使用Windows 2003编写一些PHP代码。我使用XAMPP Portable(复制到D :)。问题:
$path = 'D:\ebooks';
$all_file = scandir($path);
foreach ($all_file as $file) {
if (is_dir("$path/$file") && $file != '.' && $file != '..') {
echo $file . "<br />\n";
}
}
当我调用脚本(使用浏览器)时,我没有看到任何包含Unicode字符的目录(在D:\ ebooks中)(我用越南语,日语,中文,捷克语测试过)。
但如果我删除 is_dir("$path/$file")
,目录会显示许多奇怪的字符和许多???
个字符。
我该如何解决这个问题?
答案 0 :(得分:6)
不幸的是,有很多与PHP访问Windows文件系统相关的错误。虽然Windows确实将文件名存储为UTF-16,但PHP的内部使用了更旧的ANSI api。因此,最好只处理ascii范围内的文件名,或切换到不同的操作系统。
答案 1 :(得分:0)
这可能对捷克有所帮助,它对CJK没有帮助(我自己也在寻找)。 Buggy“Rationale”:UTF-8没问题,只要它可以映射到windows字符集。
PHP对此非常清楚:
scandir()和readdir()不支持Unicode文件名
http://bugs.php.net/bug.php?id=34574
«PHP直到PHP6才支持unicode操作。»
写于2005年9月。
你也可以尝试使用system('dir / X')来获取dos short name equivalent,解析短名和长名的结果并从那里开始工作。显示长名称,实际上使用短名称访问(对于stat,timestamp和文件打开)...